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


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來判斷是類型,然后執行不同的操作。

但是呢,這樣有不好地方,如果有多個類型,就得寫多個判斷。種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了。

如果實現方法特別多的時候,可以考慮利用工廠模式,利用反射來實例化眾多實現類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM