标签:
不知道大家对java的接口是如何理解的。在我刚接触到接口这个概念的时候,我将接口理解为一系列规则的集合,认为接口是对类的行为的规范。现在想来,将接口理解为是对类的规范多少有些偏颇,更恰当些的观点应该是:相对于类来说,接口是更深层次的抽象,虽然同时接口也起到了规定类的行为的作用。
和java的接口比起来,scala的Trait可能更具体一些。正如Trait的含义一样,它指的是一种特质,如果认为类有某种特质就混入对应的Trait好了。在scala中,类是对现实某一类事务的建模,而Trait则是对已有模型的补充。
个人以为,Trait这个概念理解起来要比接口更容易一些。
看个例子吧:狗是人类的好朋友,它在我们孤单的时候默默地陪伴。用scala可以这样定义:
trait Friend{ val name : String def accompany() = println("Your friend " + name + " accompanies you") } class Dog(val name : String) extends Friend
在代码中我们先定义了一个trait。在这个trait有一个名为name的val,但是并没有提供默认值。我们可以认为它是抽象的,需要混入trait的类提供具体的实现。这个trait还提供了一个默认的方法accompany,因为朋友的特征就是陪伴。
混入trait的类可以调用trait的方法:
new Dog("Bob").accompany()
执行结果:
此外,混入trait的类还可以重写trait的方法:
class Dog(val name : String) extends Friend{ override def accompany() = println(name + " accompanies you") } new Dog("Bob").accompany()
执行结果:
一个类混入trait后,可以通过它的实例调用trait的方法,它的实例还可以被当做是trait的引用:
new Dog("Bob").accompany() val bob : Friend = new Dog("Bob") bob.accompany()
执行结果:
一个类混入trait的数量是任意的。用关键字with就可以混入更多的trait。比如,狗除了是人类的好朋友,还是忠诚的卫士,随时都会保护我们:
trait Friend{ val name : String def accompany() = println("Your friend " + name + " accompanies you") } trait Guard{ val name: String def guard() = println(name + " is guarding you!") } class Dog(val name : String) extends Friend with Guard{ override def accompany() = println(name + " accompanies you") } val bob = new Dog("Bob") bob.accompany() bob.guard()
trait会被编译成接口和实现其方法的类。不过除了多继承这个方面以外,trait更像是抽象类。尽管在JAVA8以后,接口中也可以由默认方法了,但是变量的定义还是不可以的。忘了演示了,trait中还可以定义抽象方法的,可以自己试一下。
############
标签:
原文地址:http://www.cnblogs.com/amunote/p/5751292.html