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 !") } }
时间: 2024-10-05 10:47:21