3

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

我有一个基本的实现,但 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()。但由于有一个x()定义 for B,这就是所谓的:

B.x
A.y

有趣的是,虽然x()A's 的构造函数调用,但 Dart 不知何故知道调用B's x()。我认为这是因为调用链大致如下所示:

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

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

4

1 回答 1

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');
}
于 2015-06-15T22:29:44.553 回答