【问题标题】:Scala Traits and InheritanceScala 特征和继承
【发布时间】:2020-11-11 10:31:34
【问题描述】:

我的 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:打印“父测试”

预期行为: 我需要它来打印:“实际测试”

那么我如何调用 ActualClass 中的方法 1,而不是来自 WithClass 或 ParentClass。是否有特定的关键字。

【问题讨论】:

  • new ActualClass with WithClass 的整个想法是 WithClass 覆盖了 ActualClass 的常见定义。

标签: scala inheritance overriding multiple-inheritance


【解决方案1】:

您不能在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")
  }
}

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2013-12-21
    • 2021-04-20
    相关资源
    最近更新 更多