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

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

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

  • 相关阅读:
    (一)Python入门-3序列:04列表-元素删除的3种方式-删除本质是数组元素拷贝
    (一)Python入门-3序列:05列表-元素的访问-元素出现次数统计-成员资格判断
    Java学习笔记_180704_final和static关键字
    Java学习笔记_180702_基本类型和引用类型作为参数传递特性
    Java学习笔记_180702_面向对象编程
    如何手动实现整型数值60的二进制到十六进制的转换
    Java学习笔记_180627_循环控制语句
    兔子生兔子问题(斐波那契数列)
    Java学习笔记_180625_基础语法
    ubuntu和win10双系统,用ubuntu引导win10启动
  • 原文地址:https://www.cnblogs.com/renjie0520/p/5755345.html
Copyright © 2011-2022 走看看