Scala 中的特征和抽象方法覆盖

Posted

技术标签:

【中文标题】Scala 中的特征和抽象方法覆盖【英文标题】:Traits and abstract methods override in Scala 【发布时间】:2011-01-03 13:08:15 【问题描述】:

我有一个基础抽象类(特征)。它有一个抽象方法foo()。它由几个派生类扩展和实现。我想创建一个可以混合到派生类中的特征,以便它实现foo(),然后调用派生类的foo()

类似:

trait Foo 
  def foo()


trait M extends Foo 
  override def foo() 
    println("M")
    super.foo()
  


class FooImpl1 extends Foo 
  override def foo() 
    println("Impl")
  


class FooImpl2 extends FooImpl1 with M 

我尝试了自我类型和结构类型,但我无法让它工作。

【问题讨论】:

【参考方案1】:

你们很亲密。将 abstract 修饰符添加到 M.foo,你就有了“Stackable Trait”模式:http://www.artima.com/scalazine/articles/stackable_trait_pattern.html

trait Foo 
  def foo()


trait M extends Foo 
  abstract override def foo() println("M"); super.foo()


class FooImpl1 extends Foo 
  override def foo() println("Impl")


class FooImpl2 extends FooImpl1 with M

【讨论】:

如果我没有 M 怎么办?我正在尝试覆盖类中 Foo 的方法并遇到相同的错误。 当 foo 在超类中未实现时,super.foo() 会做什么?

以上是关于Scala 中的特征和抽象方法覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Spark基础-scala学习

抽象派生类中的抽象方法覆盖/实现抽象基类的抽象或具体方法。如何以及为啥?

scala言语基础学习六

当子类使用val实现它时,超类中的Scala抽象方法为null?

何时在 Scala 特征中使用 val 或 def?

在Scala中使用抽象类和工厂时相互调用方法(伴随对象)