【问题标题】:Abstract methods in DartDart 中的抽象方法
【发布时间】:2015-08-31 13:52:51
【问题描述】:

我正在实现一个继承层次结构,其中派生类构造仅包含对基类构造函数的调用。然后基类构造函数调用仅在派生类中实现的方法。

我有一个基本的实现,但 DartEditor 当然会抱怨基类中缺少方法。我怎样才能让它快乐?

编辑:在发布我的问题之前我还没有运行任何代码,结果证明方法绑定以人们期望的方式工作:

void main() {
    new B();
}

abstract class A {
    A() {
        x();
        y();
    }
    x() => print('A.x');
    y() => print('A.y');
}

class B extends A {
    B() : super();

    @override
    x() => print('B.x');
}

以上代码输出以下内容,这是所需的行为。 B 的构造函数调用 A 的构造函数,该构造函数调用 x()。但是由于为B 定义了一个x(),所以它被称为:

B.x
A.y

有趣的是,尽管x()A 的构造函数调用,Dart 不知何故知道调用Bx()。我认为这是因为调用链大致如下所示:

B() -> A() -> B::x()

在运行时,Dart 检查调用链以确定要绑定到哪个对象 x()

【问题讨论】:

  • 如果没有看到任何显示您尝试完成的具体代码或任何具体错误消息,很难说。
  • 这是正常的面向对象行为。如果您覆盖派生类中的方法,则会调用此方法(称为动态绑定)。您可以从派生类中显式调用基类的方法,例如 super.x();,以重用基类实现。
  • 谢谢。甚至关于在 A() 中调用 x() 绑定到 B::x() 的部分?
  • 当然。 A.x() 中的代码最初是在A 中实现的,但即使从A 中实现的代码调用代码,当前实例实际上也是B,因此会调用B 的方法。 (在我之前的评论中,它应该是“动态调度”而不是“动态绑定”)
  • 谢谢。这非常有帮助。有没有办法完全删除 A 中 x() 的实现?

标签: inheritance dart dart-editor abstract-methods


【解决方案1】:

根据您的问题,我希望有这样的代码

void main() {
 new B();
}

abstract class A {
  A() {
    a();
    b();
    c();
  }
  a();
  b();
  c();
}

class B extends A {
  B() : super();

  @override
  a() => print('a');
  @override
  b() => print('b');
  @override
  c() => print('c');
}

试试DartPad

根据您关于收到错误的评论,我希望您在基类中没有抽象方法存根。 也许这就是你要找的东西

void main() {
 new B();
}

@proxy
abstract class A {
  A() {
    a();
    b();
    c();
  }
}

class B extends A {
  B() : super();

  a() => print('a');
  b() => print('b');
  c() => print('c');
}

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2023-02-01
    • 2012-09-21
    • 2016-02-27
    • 2020-08-21
    • 2012-09-16
    相关资源
    最近更新 更多