问题一:scala为什么没有多重继承?
Scala和Java一样不允许从多个超类继承。我们知道,C++允许多重继承,但代价也是出人意料的高。主要是多重继承会出现棱形问题,也叫做钻石问题。关于多重继承的问题,可以参考http://cncc.bingj.com/cache.aspx?q=%E9%92%BB%E7%9F%B3%E9%97%AE%E9%A2%98&d=4527442594041004&mkt=zh-CN&setlang=zh-CN&w=ozz7NgJ0rhkK16PkUrkV6aIBd5PuuXmD在 C++中,需要虚拟基类来解决该问题。读者精读过C++的经典书籍《对象模型》,有兴趣的朋友可以去
研究下,还是相当复杂的。这些复杂性,让很多人心生畏惧。
问题二:Scala为什么提供特质(trait)而非接口(interface)?
java的设计者对这些复杂性心生畏惧,采取了非常强的
限制策略。
1)类只能扩充一个超类
2)可以实现任意数量的接口,但接口只能包含抽象方法,不能包含字段。
我们通常需要调用其它方法来实现某些方法,很显然,在java中做不到。java中经常看到同时提供接口和抽象基类的做法,但这样做治标不治本。如果你要同时扩展这两个抽象基类呢?
Scala提供特质而非接口。特质可以同时拥有抽象方法和具体方法,儿类可以实现多个特质。这样设计干净利落的解决了Java接口的问题。
问题三:特质可以当接口一样使用吗?
答案是肯定的。Scala特质完全可以像Java的接口那样工作。例如:
[b]
class="scala" name="code">trait Logger{
def log(msg: String)
}
[/b]
这里我们不需要将方法申明为abstract——特质中未实现的方法默认为是抽象的。
子类可以给出实现:
[b]
class ConsoleLogger extends Logger{//[color=red][b]用extends,而不是implements[/b][/color]
def log(msg:String){println(msg)}//[b][color=red]不需要写override[/color][/b]
}
[/b]
如果
你需要的特质不只一个,可以用with
关键字来添加额外的特质:
[b]
class ConsoleLogger extends Logger with Cloneable with Serializable
[/b]
和Java一样,Scala只能有一个超类,但可以有任意数量的特质。