子类可以将具体方法转换回抽象吗?

时间:2014-04-21 05:52:02

标签: scala

在scala中(或者,或许,一般情况下)是否可以使用后面强制进入更抽象方法的具体实现?例如

trait Tree {
  def print(s:String) = println(s)
}

trait Leaf extends Tree {

  def print(s:String) // force use of this to be defined later. Maybe I need the word override?

}

这个人为的例子展示了我以前从未真正考虑过的事情,即开始具体但扩展抽象。实际上,我构建了一个类似树的类结构,可以处理大多数具体代码,直到它遇到各种叶类,此时我不想忘记覆盖。

1 个答案:

答案 0 :(得分:0)

你不能"未实现"一个方法。使用您的示例,可以定义

class Foo extends Leaf

没有任何抱怨编译器,这意味着从您的Tree特征派生的所有类都将已经实现print方法。

您可以提供默认实施,但仍然要确保您不会通过使用两个特征在任何地方使用它

trait Tree {
  def method() // abstract method
}

trait DefaultImpl {
  def method() = {
    // default implementation
  } 
}

// now you can do things like

class Foo extends Tree with DefaultImpl // this will use the default implementation

class Bar extends Tree // this will not compile until you provide an implementation for method