Scala trait 未完待续

来源:互联网 发布:淘宝买家怎么导出订单 编辑:程序博客网 时间:2024/05/22 06:06

摘自《快学Scala》

14.trait的背后

Scala将trait翻译成JVM的类和接口。

只有抽象方法的trait

只有抽象方法的trait简单的变成一个Java接口。如:

trait Logger{    def log(msg:String)}//被翻译成public interface Logger{    void log(String msg);}

trait有具体的方法

有具体方法的trait,Scala会创建出一个伴生类,该伴生类用静态方法存放trait的方法。

trait ConsoleLogger extends Logger{    def log(msg:String){    println(msg)    }}//翻译成public interface ConsoleLogger extends Logger{//生成的Java接口    void log(String msg);}public class ConsoleLogger$class{    //生成的Java伴生类    public static void log(ConsoleLogger self, String msg){        println(msg);    }    ...}

这些伴生类不会有任何字段。trait中的字段对应到接口中的抽象的getter和setter。当某个类实现该trait时,字段被自动加入。
如:

trait ShortLogger extends Logger{    val maxLength = 15 //具体的字段    ...}//被翻译成public interface ShortLogger extends Logger{    public abstract int maxLength();    public abstract void weird_prefix$maxLength_$eq(int);    ...}//这里需要以weird开头的setter方法,用来初始化该字段。//初始化发生在伴生类的一个初始化方法内:public class ShortLogger$class{    public void $init$(ShortLogger self){        self.weird_prefix$maxLength_$seq(15)    }    ...}

当trait被混入类的时候,类将会得到一个带有getter和setter的maxLength字段。那个类的构造器会调用初始化方法。
如果trait扩展自某个超类,则伴生类并不继承这个超类。该超类会被任何实现该trait的类继承。

15.课后习题

1.定义一个RectangleLike trait,加入具体的translate和grow方法。

java.awt.Rectangle

0 0
原创粉丝点击