Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance Dart中的抽象方法_Inheritance_Dart_Dart Editor_Abstract Methods - Fatal编程技术网

Inheritance Dart中的抽象方法

Inheritance Dart中的抽象方法,inheritance,dart,dart-editor,abstract-methods,Inheritance,Dart,Dart Editor,Abstract Methods,我正在实现一个继承层次结构,其中派生类构造只包括对基类构造函数的调用。然后,基类构造函数调用仅在派生类中实现的方法 我有一个基本的实现,但是DartEditor当然会抱怨基类中缺少方法。我怎样才能让它快乐 编辑:在发布我的问题之前,我还没有运行过任何代码,结果证明方法绑定的工作方式与人们期望的一样: void main() { new B(); } abstract class A { A() { x(); y(); } x()

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

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

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

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

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

根据您的问题,我希望代码如下

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');
}
试穿

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

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');
}

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