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())
}

观察到的行为:

  1. 在 ActualClass 执行方法中使用 this.method1:打印“With Test”
  2. 在 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=ActualClassX#method1X#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")
  }
}