Scala编程入门---面向对象编程之Trait

Scala中Trait是一种特殊概念

首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似

在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的实现即可

类可以使用extend是关键字来继承Triat,注意这里不是Implement,而是extends,在Scala中没有Implement的概念,无论是继承还是Triat都是extends

类继承Triat后,必须实现其中的抽象方法,实现是不需要override关键字

Scala不支持对类进行多继承,但是支持多重继承triat,使用with关键字即可

 

triat sayHello{
    def sayHello(name:String)
}

triat makeFriends{
    def makeFriends(p:Person)
}

class Person(val name:String) extends sayHello with makeFriends{
    def sayHello(otherName:String)= println("hello,"+otherName+",i'm"+name)
    def makeFriends(p:Person) = println("Hello"+p.name+",I'm"+name+"i want to make friend with you ")
}

val p = new Person("leo")
val p2 = new Person("jack")

p.sayHello("jack")
p.makeFriends(p2

 

在Triat中定义具体方法

Scala中的Triat可以不是只定义抽象方法,还可以定义具体方法,此时的Triat更像是包含了通用工具方法的东西

有一个专有名词来形容这种情况,就是说Triat的功能混入了类

举例来说,triat中可以包含一些很多类都通用的功能方法,比如打印日志,sprak中就使用了triat来定义了通用日志打印法

triat Logger{
    def log(message:String) = prinl("msg:"message)
}

class Person(val name:String) extends Logger{
    def makeFrinds(p:Person){
        println("Hi,i'm"+name+",i'm glad to make friends with you ,"+p.name)
        log("make friends method is invoked with parameter Person[name="+p.name+"]")
    }
}

在Triat中定义具体字段

Scala中Triat可以定义具体field,此时继承triat就自动获取了triat中定义的field

但这种获取field的方式与继承扯拉学说是不同的:如果是继承class获取的field,实际是定义在父类中的。而继承triat获取的field,就直接被添加到类中

triat Person{
    val eyeNum =2
}

class student(name:String) extends Person{

    def  sayHello =println("Hi ,i'm "+name+",I have "+eyeNum+"eyes")
}

在triat中定义抽象字段

Scala中Triat可以定义抽象filed,triad中的具体方法可以依据抽象filed来编写

但是继承triat类,侧必须覆盖抽象filed,提供具体值

triat SayHello{
    val mes:String
    def sayHello(name:String) = println(mes+","+name)
}

class Person(name:String) extends SayHello{
    val msg:Stirng = "hello"
    def makeFriends(p:Person){
        sayHello()
        println("I'm"+name+", I want to make friends with you !")
    }
}

 

posted @ 2017-06-07 10:48  yesyeszero  阅读(307)  评论(0编辑  收藏  举报