有没有比super.test()更好的方法来调用覆盖的行为函数?

时间:2017-08-11 16:31:50

标签: dart dart-polymer

我已经为行为抽象了一堆代码,现在当我这样做时:

class B extends A with behave {
  B():super(){}
}

class A extends PolymerElement{
  A(){}
}

abstract class behave {
  test(){ print("Test"); }
}

所以我一直在努力创建一个工作流,而不必附加对这个新功能测试的引用

截至目前,如果您在A或B中实施测试,它将覆盖我创建的行为。但是我希望能更多地添加它,类似于:

class B extends A with behave {
  B():super(){}

  test():super.test(){}
}

这会像调用父测试一样。现在看这个时,我会说,如果行为在父母身上,这将是有意义的。所以让我们测试一下。

abstract class behave { ... }
class A extends behave { ... }
class B extends A {
  test(){
    super.test();
  }
}

这可以工作并执行我想要做的事情......为什么我不能在实例化中引用它? test():super.test(){ ... }看起来像刚才所说的那样会将错误视为构造函数错误。

现在如果我们把它放回原来的设计,就像B

一样
abstract class behave { ... }
class A { ... }
class B extends A with behave { 
  test(){
    super.test();
    print("Foo");
  }
}

现在它似乎按预期工作,要求我们创建对此行为的超级引用。

是否有使用:引用父函数调用的想法,或者这只是用于构造函数?我会说,是的它现在仅用于构造函数,但为什么不添加其他功能。如果我想在模仿子实现的行为中创建一系列函数,我应该在函数底部的顶部运行super.test(),具体取决于函数所需的顺序?

在阅读文档时,我在飞镖中是否遗漏了某些东西,或者这是假设暂时工作的方式?

1 个答案:

答案 0 :(得分:1)

我怀疑将foo() : super.foo()语法添加到该语言中。构造函数初始值设定项的:非常有用,因为可以在编译时分析初始值设定项,这样可以很容易地验证是否为实例设置了最终字段。函数中的:语法只是将函数调用放在函数开头的语法糖,这似乎不会增加很多值。

顺便说一下,您可以将@mustCallSuper添加到test()功能中。这将在linter中添加一个检查,覆盖test()的所有方法都必须调用super.test()