Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何访问同名容器类的成员?斯卡拉_Scala - Fatal编程技术网

Scala 如何访问同名容器类的成员?斯卡拉

Scala 如何访问同名容器类的成员?斯卡拉,scala,Scala,我有这样的想法: abstract class HaveData{ val data:String } class HD1 extends HaveData{ val data = "HD1 data" } class HD2 extends HaveData{ val data = "HD2 data" object InnerHD extends HD1{ def prt = println(data) } } 我想打印“HD2数据”而不是“HD1数据”,怎么做

我有这样的想法:

abstract class HaveData{
  val data:String
}
class HD1 extends HaveData{
  val data = "HD1 data"
}
class HD2 extends HaveData{
  val data = "HD2 data"
  object InnerHD extends HD1{
    def prt = println(data)
  }
}
我想打印“HD2数据”而不是“HD1数据”,怎么做


我可以将InnerHD转换为类并将数据作为参数提供,但有更好的方法吗?

对于这种情况,您可以使用,对于这个特定问题,您不需要添加其他类型

abstract class HaveData {
  def data: String
}
class HD1 extends HaveData {
  override val data = "HD1 data"
}
class HD2 extends HaveData { self => // Alias to this in the HD2 level.
  override val data = "HD2 data"
  object InnerHD extends HD1 {
    def prt(): Unit = {
      println(self.data)
    }
  }
}

(new HD2).InnerHD.prt()
// HD2 data

对于这种情况,您可以使用,对于这个特定的问题,您不需要添加其他类型

abstract class HaveData {
  def data: String
}
class HD1 extends HaveData {
  override val data = "HD1 data"
}
class HD2 extends HaveData { self => // Alias to this in the HD2 level.
  override val data = "HD2 data"
  object InnerHD extends HD1 {
    def prt(): Unit = {
      println(self.data)
    }
  }
}

(new HD2).InnerHD.prt()
// HD2 data
你也可以使用

def prt = println(HD2.this.data)
你也可以使用

def prt = println(HD2.this.data)

为什么要在原始代码中添加不必要的
覆盖
{
}。如果您认为它可能会引起混乱,请随意编辑:)谢谢!我还在想办法,但谢谢你!所以“self=>”应该在“data”定义之前,或者在HD2主体中的任何地方?@Djuraminkov它必须是第一个语句。为什么要在原始代码中添加不必要的
覆盖
{
}
。如果您认为它可能会引起混乱,请随意编辑:)谢谢!我还在想办法,但谢谢你!所以“self=>”应该在“data”定义之前,或者在HD2主体中的任何地方?@Djuraminkov它必须是第一个语句。这似乎是更好的解决方案,我应该重新接受这个吗?你的选择,我不会,因为另一个答案并不是真的更糟,也不是更早。这似乎是更好的解决方案,我应该重新接受这一个吗?你的选择,我不会,因为另一个答案不是真的更糟,也不是更早。