关于多个类实现同一个接口的相关资料

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来判断是类型,然后执行不同的操作。

但是呢,这样有不好地方,如果有多个类型,就得写多个判断。种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了。

如果实现方法特别多的时候,可以考虑利用工厂模式,利用反射来实例化众多实现类。

 

posted @ 2016-08-11 19:47  ``小~酒窝  阅读(8730)  评论(0编辑  收藏  举报