簡體   English   中英

Dart / Flutter - class 不必實現抽象類的抽象方法?

[英]Dart / Flutter - class doesn't have to implement abstract class's abstract methods?

在 Flutter 我們有 class

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 class 我們不必實現所有抽象 class 小部件方法和抽象方法?

我試圖模擬一些代碼

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 上混合它,我們不必隱式覆蓋這些方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM