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

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

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

多线程-----Thread类与Runnable接口的区别

第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMyThread的时候在创建三个对象的同时创建了三个线程:实现Runnable的, 相当于是拿出一个卖早餐10份的任务给三个人去共同完成,newMyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行. 一个类只能继承一个父类,存在局限:一个类可以实现多个接口.在

C#中的类属性和接口属性

类属性 类属性是类成员函数的另一种形式,它的主要任务是实现对数据的间接访问,属性的get块和set块的定义中必须明确指出是对什么数据进行访问.对于自动属性,编译器会自动创建对应的数据字段,并且实现属性的get块和set块. 接口属性 接口中可以定义属性,接口属性可以只拥有get块或set块,如果只指定了set或get访问,那么该接口属性表明,对于外部,它只允许这一种访问,这会对类实现接口属性时产生一种约束,即类中具体定义该接口属性时,其访问权限不能大于接口中指定的权限,虽然类中可以为该接口属性补

Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca

#34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void printLowercaseLetter():然 后写一个类Print实现接口InterfaceA和InterfaceB,要求      方法 实现输出大写英文字母表的功能,printLowercaseLetter()方法实现输出小写英文 字母表的功能.再写一个主类E,在主类E的main方法中创建P

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

类Collections与接口Comparator

类Collections与接口Comparator的简单使用 1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Comparator; 4 import java.util.List; 5 6 public class TestCompare { 7 8 public static void main(String[] args) { 9 10 List<BookInfo> list

Java 多线程——Thread类和Runable接口

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: [java] view plaincopy package org.thread.demo; class MyThread extends Thread{ private String name; public

java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter

FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boo

Mybatis自动生成实体类、dao接口和mapping映射文件

由于Mybatis是一种半自动的ORM框架,它的工作主要是配置mapping映射文件,为了减少手动书写映射文件,可以利用mybatis生成器,自动生成实体类.dao接口以及它的映射文件,然后直接拷贝到工程中稍微修改就可以直接使用了. 生成器目录如下: 首先进入lib文件夹中,该目录如下: (图上文件下载地址:http://download.csdn.net/detail/qiwei31229/9790909) 主要修改generatorConfig.xml <?xml version="1

Apache—DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口

Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernate的公司的首选. API介绍: org.apache.commons.dbutils.QueryRunner --BDMa