【问题标题】:How to split a parent class that implements an abstract class in Dart Flutter?Dart Flutter中实现抽象类的父类如何拆分?
【发布时间】:2021-10-07 16:33:29
【问题描述】:

我想在 Flutter 中使用一些部分类,但不知何故它不适用于已实现的抽象类。我举个例子

my_interface.dart

abstract class MyInterface {
  void method1();
  void method2();
}

my_parent.dart

import 'package:XYZ/core/init/network/firebase/my_interface.dart';

part 'my_child.dart';
class MyParent implements MyInterface {

  MyParent();

  @override
  void method1() {}
}

my_child.dart

part of 'my_parent.dart';
class MyChild extends MyParent {

_MyChild() : super();

  @override
  void method2() {}
}

如您所见,我的抽象类有 2 个方法,我想在父类中编写 method1 的主体,在子类中编写 method2 的主体。

那么当我调用这些方法时,我应该可以如下调用

MyParent().method1();
MyParent().method2();

在 dart 中可以做到吗?

【问题讨论】:

    标签: flutter dart partial-classes


    【解决方案1】:

    我应该可以按如下方式调用

    MyParent().method1();
    MyParent().method2();
    

    有两个问题:

    • MyParent 不是一个有效的类。因为它不是abstract,所以它必须是可构造的,因此所有它继承的方法都必须有某个地方的实现。
    • MyParent().method2() 没有意义。 MyParent 仅实现 method1。你希望MyParent().method2() 做什么?它的实施应该从哪里来?

    如果您希望MyParent 仅部分实现MyInterface,您可以:

    1. MyParent 也设为abstract
    2. 要么:
      • 要求调用者构造 MyChild 而不是 MyParent
      • MyParent 一个factory 构造函数(或static 方法),它构造并返回一个MyChild 实例。

    【讨论】:

      【解决方案2】:

      由此判断:

      MyParent().method1();
      MyParent().method2();
      

      看起来您特别想使用MyParent 的实例来调用您仅在子类MyChild 中的@override 方法。这不会有很好的理由。您可能有多个继承自 MyParent 的类,例如MyChild2MyChild3,因此如果您可以从 MyChild 中追溯重写 MyParent,那么它不仅会更改 MyChildMyParent,还会更改 MyChild2MyChild3。这会给每个人带来重大问题。 @override so 的意义在于您可以在子类中更改方法而不在超类中更改它。另外,MyParent 必须已经定义,以便MyChild 继承它,所以如果MyParent 依赖于MyChild 来实现method2,你会不会遇到悖论?

      如果你想使用MyParent 来调用你在运行时不知道的函数,那么只需给MyParent 一个回调字段并在准备好时提供它。或者,您可以创建一个实现method2mixin 并使用class MyParent extends MyInterface with MyMixin

      此外,如果您没有为 abstract 类中的方法提供具体实现,那么您必须在每个子类中都这样做。这意味着无论如何您都需要在MyParent 中定义@override method2,或者在MyInterface 中定义它。 See here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多