scala:定义特征并引用相应的伴随对象

ope*_*sas 3 inheritance scala traits

我正在尝试定义一个使用相应伴随对象的特征,即使用特征的类的componion对象.

例如,我有:

:paste

class Parent {
  def callMyCompanion = print(Parent.salute)
}

object Parent {
  def salute = "Hello from Parent companion object"
}

class Child extends Parent {

}

object Child {
  def salute = "Hello from Child companion object"
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个父对象:

scala> val p = new Parent()
p: Parent = Parent@1ecf669

scala> p.callMyCompanion
Hello from Parent companion object
Run Code Online (Sandbox Code Playgroud)

但是带着孩子:

scala> val c = new Child()
c: Child = Child@4fd986

scala> c.callMyCompanion
Hello from Parent companion object
Run Code Online (Sandbox Code Playgroud)

我想得到:来自Child伴侣对象的Hello

我怎么能实现呢???

- 编辑澄清

感谢您的回复,但在这种情况下,callMyCompanion是我创建的一个虚拟方法,只是为了解释自己,我试图重用父方法而不必在每个实现它的类中重写它...

到目前为止我找到的解决方案是实现一个使用伴侣obejct的实例方法......

ope*_*sas 6

到目前为止我找到的解决方案是添加对类中的伴随对象的引用,以便每个实例变量都可以到达它的类的伴随对象

这样,我只需要覆盖方法来获取对伴随对象的引用...

要做到这一点,我必须实现ParentCompanion特质......

但我不需要覆盖callMyCompanion或任何其他需要访问伴随对象的方法.

如果我能通过反射获得伴侣对象的引用,那一切都会简单得多...

代码是这样的

:paste

trait ParentCompanion {
  def salute: String
}

class Parent {
  def callMyCompanion = print(companion.salute)
  def companion: ParentCompanion = Parent
}

object Parent extends ParentCompanion {
  def salute = "Hello from Parent companion object"
}

class Child extends Parent {
  override def companion = Child
}

object Child extends Companion {
  def salute = "Hello from Child companion object"
}
Run Code Online (Sandbox Code Playgroud)


dre*_*xin 6

正如我在评论中已经写的那样,也许类型类可以在这里为您提供帮助:

trait Greeter[T] {
  def salute: Unit
}
object Greeter {
  implicit def anyToGreeter[A](x: A) = new {
    def salute(implicit greeter: Greeter[A]) = greeter.salute
  }
}

class Foo
class Bar extends Foo

implicit object FooGreeter extends Greeter[Foo] {
  def salute = println("Hello from FooGreeter.")
}
implicit object BarGreeter extends Greeter[Bar] {
  def salute = println("Hello from BarGreeter.")
}
Run Code Online (Sandbox Code Playgroud)

有了这个我得到以下输出:

scala> import Greeter._
import Greeter._

scala> new Foo().salute
Hello from FooGreeter.

scala> new Bar().salute
Hello from BarGreeter.
Run Code Online (Sandbox Code Playgroud)