Scala中的以下继承/混合有什么问题?

时间:2011-08-24 11:24:58

标签: scala

基本上我希望能够将实时或历史处理混合到我的算法中。以下内容无法编译。

// Event driven processing
class Event {

}

// Live events (as opposed to historical)
trait Live extends Event {

}

class Algorithm {

}

new Algorithm with Live 

3 个答案:

答案 0 :(得分:7)

通过声明trait Live extends Event,您指定Live只能应用于Event的子类。稍后,您尝试将其应用于Algorithm,而Event不是Event的子类,因此编译器会抱怨。

根据您的原始意图(不清楚该代码段),您可能想要:

  • Algorithm声明为特质;
  • Event延长{{1}}。

答案 1 :(得分:5)

你正在那里做多个类继承。如果特质Live延伸Event,则您的类型Algorithm with Live有两个类祖先,EventAlgorithm。这是被禁止的。你想做的事情并不清楚,但如果有可能使Event成为一个特质而不是一个阶级,那么它应该有效。 trait Live extends Event暗示Live必须与Event或子类混合。因此,如果Algorithm可以扩展Event(听起来不太可能),那也可以。

答案 2 :(得分:0)

完整的例子是:

// Event driven processing. Must be a trait due to didierd's comment
// and Jean-Philippe's comment
trait Event

// Live events (as opposed to historical)
trait Live extends Event

// Self typing isn't strictly needed but generally it's not much use without it
// as I assume you're going to want to use methods of the Event within your
// Algorithm
class Algorithm { self: Event =>
}

val t = new Algorithm with Live