【发布时间】: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 不知何故知道调用B 的x()。我认为这是因为调用链大致如下所示:
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