🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
自身类型可以在不使用继承情况下,使得一个类拥有另一个类的成员,如下为自身类型的定义格式 ```scala class ClassName { // 这个表达式就是自身类型 // this关键字可以替换成任何非关键字标识符,如self、myThis都可以 // T 可以是任何类,class、abstract class、trait等都可以 this T:=> } ``` 自身类型在`class`和`trait`中的含义不同。 <br/> **1. `trait`自身类型** ```scala class ClassA { def print = println("TraitA") } trait TraitB{ // 1. 自身类型使得TraitB拥有了ClassA的非private成员 // 2. 必须是ClassA的子类才有资格混入TraitB this:ClassA=> this.print // 调用ClassA的print方法 } // ClassC是ClassA的子类所以可以混入TraitB class ClassC extends ClassA with TraitB // ClassD不是ClassA的子类所以不能继承,或混入TraitB,这里编译时报错 class ClassD extends TraitB ``` <br/> **2. `class`自身类型** 在类中的自身类型使得类抽象化,该类在实例化时必须混入指定的特质,这也叫动态混入特质。 ```scala trait TraitA trait TraitB extends TraitA trait traitC extends TraitA trait TraitD class ClassE { // 自身类型使得ClassE拥有TraitA非private成员 // 当 new ClassE时必须混入TraitA或TraitA的子特质 // TraitA不能包含抽象成员 self: TraitA=> } object App { def main(args:Array[String]): Unit = { // 必须混入TraitA或它的子特质,这里编译报错 val classE1 = new ClassE // 编译通过 val classE2 = new ClassE with TraitB // 由于TraitD不是TraitA的子特质,所以这里编译报错 val classE3 = new ClassE with TraitD } } ```