關於多個類實現同一個接口的相關資料

http://liusu.iteye.com/blog/136690java

 

  某一天,某一個需求修改完成以後,提交代碼。我修改了一個接口,在接口文件中添加了一個方法,而且在實現類中實現。但運維同事編譯時告訴我出錯了,爲何呢,由於不知道誰在代碼路徑中把這個接口的實現類作了一個備份,我沒有在備份文件中實現添加的方法,從而報錯。在這個問題上,忽然發現本身只是瞭解一個接口多個實現類,可是歷來沒有深刻了解過,顧藉此機會整理一些東西吧。歡迎補充編程

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()

測試代表,多個實現類的狀況下,具體調用哪一個實現類,是經過實現類的實例來區分的。spa

 

2.利用instanceof關鍵字code

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來判斷是類型,而後執行不一樣的操做。對象

可是呢,這樣有很差地方,若是有多個類型,就得寫多個判斷。種作法一般被認爲是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載徹底能夠實現,這是面向對象變成應有的作法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不一樣的方法就能夠了。blog

若是實現方法特別多的時候,能夠考慮利用工廠模式,利用反射來實例化衆多實現類。接口

相關文章
相關標籤/搜索