特质
特质(Traits): 用于在类(Class)之间共享程序接口(Interface)和字段(Fields),这类似于 Java 8 中的接口,类和对象(Object)可以扩展特质,但特质不能被实例化,因此特质没有参数。
Scala 中的 trait 中可以有抽象的属性和方法、具体的属性和方法(类似于 Java 中抽象类的概念)。Scala 引入 trait 的概念,能够代替 Java 的接口,也是对的单继承机制的一种补充。。trait 用于约束程序设计的规范。一个类可以混入(mixin)多个特质。
特质和抽象类的区别:
优先使用特质,一个类可以扩展多个特质,且之呢扩展一个抽象类。
如果需要构造函数参数,应该使用抽象类,因为抽象类可以定义带参的构造函数,而特质无参!
声明特质
语法格式:
trait 特质名(
特质主体
)
案例:
trait Person {
// 声明属性
var name: String = _
// 声明方法
def play(game: String): Unit = {
}
// 抽象属性
var gender: Boolean
// 抽象方法
def eat(): String
}
使用特质
在类中,使用关键字 extends 关键字实现扩展特质,如果有多个特质或者存在父类们可以采用 with 关键字连接,使用 override 关键字实现 trait 中的抽象成员。
trait Person {
var name: String = _
def play(game: String): Unit = {}
var gender: Char
def eat(): String
}
trait cat{
def cat_yell():String
}
trait dog {
def dog_yell():String
}
// 一个类继承多个 trait
class Scala_Trait extends Person with cat{
// 实现 trait 中的抽象方法
override var gender: Char = _
override def eat(): String = ???
override def cat_yell(): String = ???
}
子类型
在需要特质的地方,可以有该特质的子类型代替。
trait Pet {
val name: String
}
class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet
val dog = new Dog("Harry")
val cat = new Cat("Sally")
动态混入
混入(mixin): 可灵活的扩展类的功能,Scala 允许对特质进行混入(同时继承多个trait),混入特质后,创建的对象是一个匿名子类对象
使用混入通常用来在不改变源代码的情况下扩充类的功能!
// 实例化对象时,可直接使用 with 实现继承
new Person with cat with dog {
// 实现 Person 的抽象属性
override var gender: Char = '男'
// 实现 Person 的抽象方法
override def eat(): String = "food1"
// 实现 cat 的抽象方法
override def cat_yell(): String = "miao~"
// 实现 dog 的抽象方法
override def dog_yell(): String = "wnang~"
}
本文详细介绍了Scala中的特质如何作为接口与字段共享,与抽象类的区别,以及混入机制的应用。重点讲解了如何声明和使用特质,以及在类设计中的灵活性和规范性。
2061

被折叠的 条评论
为什么被折叠?



