1、 Mixin(混合类型):一个类出了实现它的“基本类型”之外,还可以实现这个mixin类型,以表明他提供了某些可供选择的行为。---用接口来定义,抽象类不能。
2、 他允许可选的功能被混合到一个类型的基本功能中。
3、 接口可以是我们构造出非层次结构的类型框架。但有些事物不能整齐的组织成一个严格的层次结构。 比如 歌唱家 和 作曲家。
Public interface Singer{ --- Sing(Song s);}
Public interface SongWriter{ --- compose(Song s);}
新的接口: publicinterface SSW extends Singer,SongWriter{---XXX();}
另一个做法是:写个膨胀(bloated)的类层次,对于每一种要被支持的属性组合,都包含一个单独的类。如果在整个类型系统中有N个属性,则共有2^N 种可能组合有带提供支持---------------------组合爆炸(combinatorialexplosion)。
4、接口的作用时定义类型,但 骨架实现类 的实现类负责所有与借款单实现相关的工作。
||||
把接口和抽象类的优点结合,对于每个期望导出的重要接口都提供一个抽象的骨架实现类。 ------------------------AbstractInterface如:AbstractSet AbstractList………
4、 骨架实现类 有助于接口的实现。 实现了这个接口的类可以把对于接口方法的调用,转发到另一个内部私有类的实例上,而这个内部私有类扩展了骨架实现类。---模拟多重继承(包装类模式有关系)。
骨架类实现的编写:
研究接口,确定最为基本的(primitive)方法,其他方法在实现的时候以他们为基础。这些方法僵尸骨架实现类中的抽象方法。然后必须对接口中所有其他的方法提供具体的实现。
比如 : Map.Entry 接口
Public abstract class AbstractMapEntryimplements Map.Entry{
//primitives
Public abstract Object getkey();
Pbulic abstract Object getValue();
//Entries in modifiable maps must overridethis method
Public Object setValue(Object value){
throw new UnsupportedOperationException();
}
//implements the general contract of Map.Entry.equals
Public boolean equals(Object o){
If( o == this)
Returntrue;
If(!(oinstanceof Map.Entry))
Returnfalse;
Map.Entry arg= (Map.Entry) o ;
Return eq( getKey() , arg.getKey())&&eq(getValue() , arg.getValue());
}
Private static boolean eq(Object o1 , Object o2 ){
Return(o1 == null ? o2 == null : o1.equals(o2));
}
//Implements the general contract ofMan.Entry.hashcode
Public inthashCod(){
Return
(getKey() == null ? 0: getKey().hashCode())^
(getValue() == null ?0: getValue ().hashCode());
}
}