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来判断是类型,然后执行不同的操作。
但是呢,这样有不好地方,如果有多个类型,就得写多个判断。种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了。
如果实现方法特别多的时候,可以考虑利用工厂模式,利用反射来实例化众多实现类。
时间: 2024-10-06 11:26:21