2017-08-11 87 views
0

我已经抽象为行为一串代码,而现在当我这样做:有没有比super.test()更好的方法来调用重写的行为函数?

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

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

顺便说一句,您可以将@mustCallSuper添加到您的test()函数。这将为linter添加一个检查,即覆盖test()的所有方法都必须调用super.test()

+0

我不知道那个注释。这很酷。我将开始使用它 – Fallenreaper

相关问题