首页 > 解决方案 > Dart / Flutter - 类不必实现抽象类的抽象方法?

问题描述

在 Flutter 中,我们有课

abstract class PreferredSizeWidget implements Widget {
  Size get preferredSize;
}

@immutable
abstract class Widget extends DiagnosticableTree {
  const Widget({ this.key });
  final Key? key;
  @protected
  @factory
  Element createElement();
  @override
  String toStringShort() {
    final String type = objectRuntimeType(this, 'Widget');
    return key == null ? type : '$type-$key';
  }

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;
  }

  @override
  @nonVirtual
  bool operator ==(Object other) => super == other;

  @override
  @nonVirtual
  int get hashCode => super.hashCode;
  static bool canUpdate(Widget oldWidget, Widget newWidget) {
    return oldWidget.runtimeType == newWidget.runtimeType
        && oldWidget.key == newWidget.key;
  }
  static int _debugConcreteSubtype(Widget widget) {
    return widget is StatefulWidget ? 1 :
           widget is StatelessWidget ? 2 :
           0;
    }
}

我的问题是:为什么如果我们混合使用 PreferredSizeWidget 类,我们不必实现所有抽象类 Widget 方法和抽象方法?

我试图模拟一些代码

class A implements B {}

abstract class B extends C {}

abstract class C {
  void test() {
    print("test");
  }
}

并得到错误

Error: The non-abstract class 'A' is missing implementations for these members:
 - C.test
class A implements B {
      ^
lib/main.dart:16:8:

标签: flutterdartinterfaceabstract-classabstract

解决方案


我自己没有运行它,但在你的情况下,A 不再是抽象的,所以它必须实现所有东西,在 PreferredSizeWidget 的情况下 - 你通常在一个小部件上扩展/实现/混合它(它已经实现了小部件的所有内容)因此只给你留下了preferredSize

@Norbert515的回答。

要点是即使我们混合/扩展 PreferredSizeWidget 我们实际上实现了所有 Widget 方法,但是由于我们通常在 Widget 上混合它,我们不必隐式覆盖这些方法。


推荐阅读