http://liusu.iteye.com/blog/136690
某一天,某一個需求修改完成之后,提交代碼。我修改了一個接口,在接口文件中添加了一個方法,並且在實現類中實現。但運維同事編譯時告訴我出錯了,為什么呢,因為不知道誰在代碼路徑中把這個接口的實現類做了一個備份,我沒有在備份文件中實現添加的方法,從而報錯。在這個問題上,突然發現自己只是了解一個接口多個實現類,但是從來沒有深入了解過,顧借此機會整理一些東西吧。歡迎補充
1.一個接口,多個類implements該接口
public class Main {
public static void main(String[] args) {
InterfaceTest a = new AImpl();
InterfaceTest b = new BImpl();
InterfaceTest c = new CImpl();
a.toPrint();
b.toPrint();
c.toPrint();
}
}
public interface InterfaceTest {
public void toPrint();
}
public class AImpl implements InterfaceTest {
public void toPrint(){
System.out.println("A toPrint function()");
}
}
public class BImpl implements InterfaceTest {
public void toPrint(){
System.out.println("B toPrint function()");
}
}
public class CImpl implements InterfaceTest {
public void toPrint(){
System.out.println("C toPrint function()");
}
}
運行輸出結果為:
A toPrint function()
B toPrint function()
C toPrint function()
測試表明,多個實現類的情況下,具體調用哪個實現類,是通過實現類的實例來區分的。
2.利用instanceof關鍵字
public class Main { public static void main(String[] args) { InterfaceTest a = new AImpl(); InterfaceTest b = new BImpl(); InterfaceTest c = new CImpl(); checkFun(a); checkFun(b); checkFun(c); } public static void checkFun(InterfaceTest test){ if(test instanceof AImpl){ System.out.println("from AImpl"); }else if(test instanceof BImpl){ System.out.println("from BImpl"); }else if(test instanceof CImpl){ System.out.println("from CImpl"); } } }
將接口實例作為參數,利用instanceof來判斷是類型,然后執行不同的操作。
但是呢,這樣有不好地方,如果有多個類型,就得寫多個判斷。種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了。
如果實現方法特別多的時候,可以考慮利用工廠模式,利用反射來實例化眾多實現類。
