Scala 特性和继承 [英] Scala Traits and Inheritance
问题描述
我的 Scala 类结构如下:
I have my Scala classes structured as below:
trait ActualClass extends ParentClass {
override def method1(inputStr:String):String = {
"actual "+ inputStr
}
def execute():String = {
this.method1("test")
}
}
trait WithClass extends ParentClass {
override def method1(inputStr:String):String = {
"with "+ inputStr
}
}
class ParentClass {
def method1(inputStr:String):String = {
"parent "+ inputStr
}
}
object TestClass extends App{
val actualClass = new ActualClass with WithClass {
}
println(actualClass.execute())
}
观察到的行为:
- 在 ActualClass 执行方法中使用 this.method1:打印With Test"
- 在 ActualClass 执行方法中使用 super.method1:打印父测试"
预期行为:我需要它来打印:实际测试"
Expected Behavior: I need it to print: "Actual Test"
那么我怎样才能调用 ActualClass 中的 method1 而不是来自 WithClass 或 ParentClass.有没有具体的关键字.
So how can I invoke the method1 that is within the ActualClass and not from WithClass or ParentClass. Is there a specific keyword for it.
推荐答案
您不能在 ActualClass
中专门调用 ActualClass#method1
.
You can't call specifically ActualClass#method1
within ActualClass
.
如果你想要结果 actual test"
你应该定义 val actualClass
反之亦然
If you want result "actual test"
you should define val actualClass
vice versa
val actualClass = new WithClass with ActualClass
(根据线性化顺序选择方法实现).
(method implementation is selected according to linearization order).
通常,您不能使用 this.someMethod
在 SomeClass
中专门调用 SomeClass#someMethod
.实现总是可以在继承者中被覆盖(除非方法是最终的).如果可以,这将违反 OOP 原则.你不能以这种方式控制this
.所以 X=ActualClass
在 X#method1
和 X#execute
中相同在这个意义上是不相关的.
Generally you can't call specifically SomeClass#someMethod
within SomeClass
with this.someMethod
. Implementation can always be overriden in an inheritor (unless the method is final). If you could this would be against OOP principles. You can't control this
in such way. So X=ActualClass
being the same in X#method1
and X#execute
is irrelevant in this sense.
这就是为什么有语法super[A].someMethod
(为了不依赖线性化)而不是this[A].someMethod
.
That's why there is syntax super[A].someMethod
(in order not to rely on linearization) but not this[A].someMethod
.
你也可以试试
trait ActualClass extends ParentClass {
override def method1(inputStr:String):String = {
"actual "+ inputStr
}
def execute():String = {
(new ActualClass {}).method1("test")
}
}
这篇关于Scala 特性和继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!