scala的trait之我见

trait近似于java的interface,但也不完全等同。比如,trait可以没有任何的abstract方法,就跟一个普通类一样。
它是被mixin到子类中(动态或静态),而非继承到子类,为何这么说,因为extend一个trait,相当于继承这个trait的超类,同时mixin这个trait。
从某种意义上说,trait兼具“能力抽象”和“能力实现”两方面的特点,前者用C++里public继承的术语讲是is-a,后者用C++里private继承的术语讲是has-a。所以,scala的trait同时具有is-a和has-a两种特点。
一般说来,如果一个trait起到的是类似java interface的用途,我会这样写:
class Derived extends BaseTrait
等价于C++里的:
class Derived public BaseTrait

而如果要具备某些utility函数的能力,我会这样写:
class Derived extends AnyRef with SomeFuncTrait
等价于C++里的
class Derived private SomeFuncTrait

猜你喜欢

转载自blog.csdn.net/tlxamulet/article/details/77870918