flutter - 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:
解决方案
我自己没有运行它,但在你的情况下,A 不再是抽象的,所以它必须实现所有东西,在 PreferredSizeWidget 的情况下 - 你通常在一个小部件上扩展/实现/混合它(它已经实现了小部件的所有内容)因此只给你留下了preferredSize
@Norbert515的回答。
要点是即使我们混合/扩展 PreferredSizeWidget 我们实际上实现了所有 Widget 方法,但是由于我们通常在 Widget 上混合它,我们不必隐式覆盖这些方法。
推荐阅读
- java - 当 JAVA_HOME 的确切路径在同一个地方工作时,为什么 JAVA_HOME 在 Path 中失败?
- reactjs - 更改字体系列 Material-UI
- ruby-on-rails - Vue-Multiselect显示对象而不是“名称”字段
- html - 输入电话号码验证模式
- javascript - 添加css以将表格格式化为网格
- javascript - 如何让onclick显示php文件的内容
- python - 如何创建表并选择数据库中的任何列?
- javascript - 想要使用 IDE (NetBeans) 实现声音文件,但引用的是实际文件而不是 URL
- zsh - ZSH 自定义提示
- rasa-nlu - Rasa 聊天机器人可以发起对话吗?