Scala 特征和继承
Scala Traits and Inheritance
我的 Scala 类 结构如下:
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:打印“parent Test”
预期行为:
我需要它来打印:“实际测试”
那么我如何调用 ActualClass 中的 method1 而不是来自 WithClass 或 ParentClass。是否有特定的关键字。
您不能在 ActualClass
内专门调用 ActualClass#method1
。
如果你想要结果 "actual test"
你应该定义 val actualClass
反之亦然
val actualClass = new WithClass with ActualClass
(根据线性化顺序选择方法实现)
通常您不能在 SomeClass
内用 this.someMethod
专门调用 SomeClass#someMethod
。实现总是可以在继承者中被覆盖(除非方法是最终的)。如果可以的话,这将违反 OOP 原则。你无法以这种方式控制 this
。所以 X=ActualClass
在 X#method1
和 X#execute
中相同在这个意义上是无关紧要的。
这就是为什么有语法 super[A].someMethod
(为了不依赖线性化)而不是 this[A].someMethod
。
你也可以试试
trait ActualClass extends ParentClass {
override def method1(inputStr:String):String = {
"actual "+ inputStr
}
def execute():String = {
(new ActualClass {}).method1("test")
}
}
我的 Scala 类 结构如下:
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:打印“parent Test”
预期行为: 我需要它来打印:“实际测试”
那么我如何调用 ActualClass 中的 method1 而不是来自 WithClass 或 ParentClass。是否有特定的关键字。
您不能在 ActualClass
内专门调用 ActualClass#method1
。
如果你想要结果 "actual test"
你应该定义 val actualClass
反之亦然
val actualClass = new WithClass with ActualClass
(根据线性化顺序选择方法实现)
通常您不能在 SomeClass
内用 this.someMethod
专门调用 SomeClass#someMethod
。实现总是可以在继承者中被覆盖(除非方法是最终的)。如果可以的话,这将违反 OOP 原则。你无法以这种方式控制 this
。所以 X=ActualClass
在 X#method1
和 X#execute
中相同在这个意义上是无关紧要的。
这就是为什么有语法 super[A].someMethod
(为了不依赖线性化)而不是 this[A].someMethod
。
你也可以试试
trait ActualClass extends ParentClass {
override def method1(inputStr:String):String = {
"actual "+ inputStr
}
def execute():String = {
(new ActualClass {}).method1("test")
}
}