问题一: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]
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只能有一个超类,但可以有任意数量的特质。
问题四:特质(trait)有什么好的地方?
Trait就像拥有部分实现的接口,它提供了介于单一继承和多重继承的中间地带,因此可以在其它类里混入(mix in)它们,混入的概念可以参考如下连接:
http://cncc.bingj.com/cache.aspx?q=scala+%E6%B7%B7%E5%85%A5++%E5%86%B0%E6%B7%87%E6%B7%8B%E5%85%B8%E6%95%85&d=4852335367751471&mkt=zh-CN&setlang=zh-CN&w=3fclnwBatJeeli84tZKeDtUd0r6IUVtB。这样可以用一组特性对类进行加强。
先对Friend类建模,然后将其混入任何类:Man,Woman,Dog等。
假定我们已经建模出Human,想让它成为朋友。朋友是能倾听你说话的人,所以给Human增加一listen方法,如下所示:
[b]
class Human(var name:String){
def listen()=println("Your friend "+name+" is listening")
}
class Man(override val name:String) extends Human(name)
class Woman(override val name:String) extends Human(name)
[/b]
可以看出,朋友这方面的特性不是很突出,而且它被并入的Human类中。开发一段时间后,发现Dog也是人类的好朋友。怎样才能让狗成为人类的好朋友呢?java解决这个问题的方法是创建一个借口Friend,让Human,Dog都实现这个接口。因此,我们不得不在这两个类中提供不同的实现。
这个时候,Scala的trait介入了。trait像一个拥有部分实现的接口。var、val会在混入trait类的内部得到实现。这里注意:定义过而未初始化的val,val被认为是抽象的,需要由混入这些特质的类实现。如下代码所示:
trait Friend{
val name:String
def listen()=println("Your friend"+" is listening");
}
class Human(val name:String) extends Friend
class Dog(val name:String) extends Friend
class Man(ovrride val name:String) extends Human
class Woman(override val name :String) extends Man
class Dog(val name:String)extends Animal with Friend{
override def listen=println(name+"'s listening quietly")
}
一个类被混入trait之后,通过它的实例可以调用到trait的方法,也可以把它的引用当做trait的引用。
[b]
val john=new Man("john")
val sara=new Woman("sara")
val comet=new Dog("comet")
john.listen //输出:Your friend john is listening
sara.listen //输出:Your Friend sara is listening
comet.listen //输出:comet's listening quietly
val mansBestFriend:Friend =comet //获取引用
mansBestFreind.listen //comet's listenning quitely
def helpAsFriend(friend:Friend)=friend listen
helpAsFriend(sara) //输出:Your fiend Sara is listening
helpAsFriend(comet) //输出:comet's listening quitely
[/b]
注意,trait看上去很像类,但还是有很大的区别:
1)trait需要混入类去实现那些已申明的而未初始化的变量和值。
2)它们的构造器不能有任何参数
//如要转载,请留下评论并复制本文链接到文章中
分享到:
相关推荐
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
共13页第15讲-Scala编程详解:面向对象编程之Trait 共14页第16讲-Scala编程详解:函数式编程 共14页第17讲-Scala编程详解:函数式编程之集合操作 共9页第18讲-Scala编程详解:模式匹配 共11页第19讲-Scala编程详解:...
### Scala编程语言详解知识点 #### 一、Scala简介与特性 **Scala** 是一门结合了面向对象编程和函数式编程特点的多范式编程语言。它由 Martin Odersky 在瑞士洛桑联邦理工学院(EPFL)开发。Scala 的名称来源于 ...
面向对象编程之类第13讲-Scala编程:面向对象编程之对象第14讲-Scala编程:面向对象编程之继承第15讲-Scala编程:面向对象编程之Trait第16讲-Scala编程:函数式编程第17讲-Scala编程:函数式编程之集合操作第18讲-...
### Scala入门知识点详解 #### 一、Scala简介与特点 **Scala**是一种融合了面向对象编程和函数式编程特性的现代编程语言。它被设计成一种可扩展的语言,旨在克服传统编程语言的一些限制,同时保持代码的简洁性和...
### Scala设计模式详解 #### 一、概述 Scala设计模式是指在Scala编程语言中实现的一系列软件设计模式。设计模式是一套被反复使用的、经过分类编目的、多种涉及软件设计的解决方案,它们代表着最佳实践,通常被有...
第1章 零到六十:Scala简介 1 1.1 为什么选择Scala 1 1.1.1 富有魅力的Scala 2 1.1.2 关于Java 8 3 1.2 安装Scala 3 1.2.1 使用SBT 5 1.2.2 执行Scala命令行工具 6 1.2.3 在IDE中运行Scala ...
### Scala编程基础知识点详解 #### 一、课程目标与概述 **课程目标**: 1. **初级目标**:能够熟练地使用Scala编写Spark程序。这包括掌握Scala的基础语法以及如何结合Spark进行数据处理。 2. **中级目标**:能够...
### Scala基础语法详解 #### 一、Scala简介与特点 Scala是一种现代的多范式编程语言,它结合了面向对象编程和函数式编程的特点。Scala的设计目标是解决Java等传统面向对象语言在扩展性和灵活性方面的局限性。Scala...