接口和内部类为我们提供了一种将接口和实现分离的更加结构化的方法。
1. 抽象类
包含抽象方法的类叫作抽象类。使用抽象类创建对象会报错。继承抽象类必须为基类中所有抽象方法提供方法定义,若不,则导出类也是抽象类。也可以创建没有抽象方法的抽象类,只是不能实例化。
abstract class Instrument{
public String what() {return "Instrument";}
public abstract void adjust();
}
2. 接口
接口提供了形式,而未提供任何具体实现。接口被用来建立类与类之间的协议。
接口中被定义的方法必须被定义为public(默认也为public)。接口也可以包含域,但域隐式地是static和final的。
**策略模式:创建一个能够根据所传递的参数对象的不同而具有不同行为的方法。
**适配器模式:接受你所拥有的接口,并产生你所需要的接口。
通过继承可以扩展接口,组合不同的接口中使用相同的方法名会造成代码可读性的混乱。
嵌套接口:值得注意的是,嵌套接口为private时,即时用public方法可以返回值,但不可直接使用,除非将返回值交给有权使用它的对象。
class A{
private interface D{
void f();
}
public class DImp implements D{
public void f(){}
}
public D getD(){ return new DImp(); }
public void receiveD(D d){
d.f();
}
}
class exp{
public static void main(String[] args){
A a = new A();
//Cannot access A.D
//! A.D ad = a.getD();
//Doesnt return anything but A.D
//! A.DImp di = a.getD();
//Cannot access a member of the interface
//! a.getD().f();
//Only another A can do anything with getD();
A a2 = new A();
a2.receiveD(a.getD());
}
}
**接口与工厂方法:接口与工厂方法结合可以完全将代码与接口分离。对于创建类,几乎在任何时刻,都可以替代为创建一个接口和一个工厂。
interface Game{ boolean move();}
interface GameFactory{ Game getGame(); }
class Checkers implements Game{
.....
}
class CheckersFactory implements GameFactory{
public Game getGame() { return new Checkers() }
}
class Chess implements Game{
...
}
class ChessFactory implements GameFactory{
public Game getGame() { return new Chess() }
}
public class Games {
public static void palyGame(GameFactory factory){
Game s = factory.getGame();
...
}
public static void main(String[] args){
playGame( new ChessFactory);
playGame( new CheckersFactory);
}
}
总结:
任何抽象化都应该是真正应需求而产生,必需时,应该重构接口,恰当的原则应该是优先选择类而不是接口。从类开始,如果接口的必需性变得非常明确,就进行重构。
网友评论