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來判斷是類型,然后執行不同的操作。
但是呢,這樣有不好地方,如果有多個類型,就得寫多個判斷。種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了。
如果實現方法特別多的時候,可以考慮利用工廠模式,利用反射來實例化眾多實現類。