Scala 特性和继承 [英] Scala Traits and Inheritance

查看:68
本文介绍了Scala 特性和继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

观察到的行为:

  1. 在 ActualClass 执行方法中使用 this.method1:打印With Test"
  2. 在 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.someMethodSomeClass 中专门调用 SomeClass#someMethod.实现总是可以在继承者中被覆盖(除非方法是最终的).如果可以,这将违反 OOP 原则.你不能以这种方式控制this.所以 X=ActualClassX#method1X#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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆