zoukankan      html  css  js  c++  java
  • 关于多个类实现同一个接口的相关资料

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

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

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

  • 相关阅读:
    5.21php
    5.20日报
    kubernetes
    kubernetes
    Kubernetes
    Docker
    Docker
    Docker
    Docker
    Docker
  • 原文地址:https://www.cnblogs.com/renjie0520/p/5755345.html
Copyright © 2011-2022 走看看