ONE:
- Trait 类 对象 继承 java单继承 实现多个接口! java8提供了lambda,接口可以提供一些实现
- scala 也一样,不支持多继承! 但是scala允许你扩展! 继承多个Trait,理解的时候可以理解为接口, scala 和 trait 可以有具体的方法和Field
- trait 作为接口来使用 extends 不要override也可以(JAVA中实现方法也不需要override)
代码实现:
package com.test
trait HelloTrait {
def sayHello(name: String)
}
trait MakeFriendsTrait {
def makefriendsTrait(p: Persion)
}
class Persion(val name: String) extends HelloTrait with MakeFriendsTrait {
def sayHello(name: String) = {
println("Hello," + name)
}
def makefriendsTrait(p: Persion) = {
println("hello my name is " + name + "your name is " + p.name)
}
}
object ObjectTrait {
def main(args: Array[String]): Unit = {
val persion1 = new Persion(" xiao bai tu ")
val persion2 = new Persion(" da hui lang ")
persion1.sayHello("xiao hui lang")
persion1.makefriendsTrait(persion2)
}
}
结果展示:
TWO:
- Scala 中的 Trait 还可以有具体的方法
代码实现:
package com.test
trait logger {
def log(massage: String): Unit = {
println(massage)
}
}
class Persion(val name: String) extends logger {
def makefriends(p: Persion): Unit = {
println("hello " + name + " me is a " + p.name)
log("makefriends " + p.name)
}
}
object ObjectTrait {
def main(args: Array[String]): Unit = {
val persion = new Persion("花花")
val persion1 = new Persion("世界")
persion1.makefriends(persion)
}
}
结果展示:
THREE:
- Thrait 还可以定义具体的field, 这种方法里获取到的Field和继承父类里面的Field是不同的!!!
- 定义公共属性, 被继承之后可以直接调用(像JAVA中的常量)
代码实现:
package com.test
trait Person{
val eyesum : Int = 2
}
class Student (val name:String) extends Person{
def savHello= println("nihao"+ name +"I hive " + eyesum + "eyes")
}
object ObjectTrait {
def main(args: Array[String]): Unit = {
val student = new Student("大白")
student.savHello
}
}
结果展示:
FOUR:
抽象Field
代码展示:
package com.test
trait SayHello {
val msg: String
def sayHello(name: String) = println(msg + name)
}
class Person(val name: String) extends SayHello {
val msg: String = "ni hao"
def makeFridends(p: Person) {
sayHello(p.name)
println(" my name is "+ name)
}
}
object ObjectTrait {
def main(args: Array[String]): Unit = {
val person = new Person("马云")
val person1 = new Person("马芸")
person.makeFridends(person1)
}
}
结果展示:
FIVE:
Trait最牛之处
请看代码:
package com.test
trait Logged {
def log(msg:String): Unit ={
}
}
trait MyLogger extends Logged{
override def log(msg: String): Unit = {
println("log" + msg)
}
}
class Person(val name: String) extends Logged {
def sayHellow: Unit ={
println("hi "+ name)
log("sayHello is invoked!")
}
}
object ObjectTrait {
def main(args: Array[String]): Unit = {
val person = new Person("马云")
val person1 = new Person("马芸") with MyLogger //这里可以混入多个 继续在后面 with XXX witch XXX
person.sayHellow
println("-------------------------")
person1.sayHellow
}
}
结果展示:
SIX:
- Thrit 调用链也是高级功能! 可以直接实现我们的设计模式:负责链设计模式!
- 说白了 就是让相似的对象一次调用同一个方法! 然后把它们 组成一个调用链条!
- super
- 类中调用多个Trait中都有的方法时 , 会从最右边的Trait开始执行!
代码实现:
package com.test
trait Handler {
def handle(data: String) {}
}
trait MyHandler extends Handler {
override def handle(data: String): Unit = {
println("check my data : " + data)
super.handle(data)
}
}
trait YouHandler extends Handler {
override def handle(data: String): Unit = {
println("check you data : " + data)
super.handle(data)
}
}
class Person(val name: String) extends MyHandler with YouHandler {
def savHello = {
println("hell " + name)
handle(name)
}
}
object ObjectTrait {
def main(args: Array[String]): Unit = {
val person = new Person("马云")
person.savHello
}
}
结果展示: