以下出自:http://blog.csdn.net/lovehuangjiaju/article/details/47029287

 

组合的代码示例:



class Head
class Body
class Hand
//....

//Person类
abstract class Person(var name:String,var age:Int){
  //各类的实例作为该类对象的一部分,通过各类的实例方法实现代码重用
  val head:Head=null  
  val body:Body=null
  val hadn:Hand=nulll
  //....
}

组合和集成使用总结:

继承

 继承是Is a 的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。
继承的缺点有以下几点:
1 父类的内部细节对子类是可见的。
2 子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。
3 如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想。

组合

组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。

组合的优点
1 当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。
2 当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。
3 当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。
组合的缺点
1 容易产生过多的对象。
2 为了能组合多个对象,必须仔细对接口进行定义。

由此可见,组合比继承更具灵活性和稳定性,所以在设计的时候优先使用组合。只有当下列条件满足时才考虑使用继承

1 子类是一种特殊的类型,而不只是父类的一个角色
2 子类的实例不需要变成另一个类的对象
3 子类扩展,而不是覆盖或者使父类的功能失效

实际上scala丰富的trait的混入功能,比起集成和java的interface要强大的多,更加的灵活和可用,因此组合在scala中不是最佳选择,而是trait。

当然,不能讲trait当做接口来用。

个人感觉