1.Trait中定义抽象方法
Trait可以被作为接口来使用,此时Trait与Java的接口非常类似。在Scala中,类继承Trait后,必须实现其中的抽象方法(类似interface),实现时不需要使用override关键字,同时Scala同Java一样,不支持类多继承,但支持多重继承Trait,使用with关键字即可。
注意:类使用extends继承Trait,与Java不同,这里不是implement,在Scala中,无论继承类还是继承Trait都是用extends关键字。
trait HelloTrait{
def sayHello(name:String)
}
trait makeFriendsTrait{
def makeFriends(p:Person)
}
class Person(val:name String) extends HelloTrait with makeFriendsTrait{
def sayHello(name:String) = println("Hello," + name)
def makeFriends(p:Person) = println("Hello," +p.name + " my name is " + name)
}
2.Trait中定义具体方法,具体字段
Scala中的Trait不只定义抽象方法,还可以定义具体方法,也有的说法是Trait的功能混入了类。 Trait也可以定义具体字段,继承Trait的类就自动获取了Trait中定义的类。
注意:这里与继承Class不同,如果继承Class获取的字段,实际定义在父类中,而继承Trait获取的字段,就直接添加到了类中。
trait HelloTrait{
val friendsNum = 2
def sayHello(name:String) = println("Hello," + name)
}
class Person(val:name String) extends HelloTrait{
def makeFriends(p:Person) = println("Hello," +p.name +",I have " + friendNum + " friends")
sayHello(name)
}
3.Trait中定义抽象字段
Trait中可以定义抽象字段,而Trait中的具体方法可以基于抽象字段来编写,但继承Trait的类,则必须覆盖抽象的field,提供具体的值。
trait HelloTrait{
val message:String
def sayHello(name:String) = println(message, + "," + name)
}
class Person(val:name String) extends HelloTrait{
val message:String = "Hello"
def makeFriends(p:Person) = {
println("Hello," +p.name +",I have " + friendNum + " friends")
sayHello(name)
}
}