大家讨论一下:什么情况下使用接口才能发挥接口的优势?*******  希望能通过很简单很简单的例子来说明,这样比单纯的语言表达得更清楚!问题越辩越明!

解决方案 »

  1.   

    接口就像一纸合同,在 caller 和 callee 之间达成一个 contract,然后,各自关注各自份内的事情。定义了一套接口,就是制定了一套规范,比如 Servlet 2.3 specification,有了这套规范后,写 web application 的人就不必太关心将来你的程序是跑在 tomcat 上还是跑在 weblogic 上。简而言之,接口的意义主要在于“设计重用”。相对来说,抽象类、类继承等的意义更倾向于“代码重用”。以上是我的粗浅理解,肯定不全面,也不一定正确。希望听到更精辟的见解。
      

  2.   

    需要多重继承的时候用interface
      

  3.   

    java类不支持多继承,如果要实现多重继承的话用interface
      

  4.   

    maquan('ma:kju) ( ) 
     
    > 多继承的时候用接口非也!这个说法似是而非
    _______________________________
    愿闻其祥~~~~  
     
      

  5.   

    类继承(extends)和实现接口(implements)是完全不同的两回事,怎么能说“用接口实现多继承”呢?比如有两个基类 Base1 和 Base2,有两个接口 Intf1 和 Intf2,下面需要定义一个 MyClass 来实现一定的功能。如果是『MyClass extends Base1, Base2』(当然 Java 并不支持多继承,现在姑且这么说),那么在 MyClass 里不需要再写任何代码,它就已经具有了两个基类的原有功能;而如果是『MyClass implements Intf1, Intf2』,那么,在 MyClass 里必须按照两个接口的要求实现所有的方法,MyClass 才能用。可以看出,两种做法是完全不同的。当然,仅从 Caller 程序员的角度看,用“继承”的时候,通过 MyClass 可以调用两个基类所声明的方法,用“实现”的时候,通过 MyClass 可以调用两个接口所声明的方法,好像有点差不多,所以我说“似是”;但从 Callee 程序员的角度看,两者在“面向对象”的世界里所扮演的角色是完全不同的,“继承”是用来实现“代码重用”,而“接口”更多体现的是“设计重用”,所以我说“而非”。个人理解,欢迎指正  :)
      

  6.   

    maquan('ma:kju)类继承(extends)和实现接口(implements)是完全不同的两回事,怎么能说“用接口实现多继承”呢?
    ________________________________________________
    谢谢maquan指点,小弟对java不是很精通,感觉用接口可以实现多继承,于是如此说了,谢谢指正~~~
      

  7.   

    我想问一下:java和vb的连接用接口解决的怎么弄
    我问的可能不标准
    但是我不知道怎么问
      

  8.   

    interface IA 包含eat()
     
    interface IB 包含hit()
    class Person implement a,b
    {
      实现eat();
      实现hit();
    }
    class Person1 implement a,b
    {
      实现eat();
      实现hit();
    }class Test
    {
        main(){
            Person p = new Person(); //具体实现
            system.out.println(p.eat());
            system.out.println(p.hit());
            IA ia= new Person();    //向上转型  当需要person1类中的方法时不需要改
                                   变下边的代码  只该这个定义就行了
            system.out.println(ia.eat());
            system.out.println(ia.hit());//错误
            IB ib= new Person();   //向上转型  当需要person1类中的方法时不需要改
                                   变下边的代码 只该这个定义就行了
            system.out.println(ia.eat());//错误
            system.out.println(ia.hit());
                }
    }
      

  9.   

    JAVA和.Net在接口方面, 差异很大.java推荐使用接口去定义不同实现的东西, 比如EJB, java.sql包等, sun只定义了接口, 里面的方法都由各厂去覆盖重写, java注重使用者只需要知道接口的定义, 不需要清楚其实现;.net确差异很大, .net更喜欢用虚拟类和实类来做(看看ADO.NET的类和java.sql的差别~),  只有最高层的抽象, 才用接口, 例如ISerializable, IXPathNavigable.
    MSDN上有篇文章是对.net中使用虚拟类和接口的比较文章, 可以看得出, 大部分情况下, MSDN更推荐用虚拟类.
      

  10.   

    简单说
    一个接口里面一个方法是在控制台输出信息,两个类一个B一个C都实现了A的方法
    但B打出来的是B,C打出来的是C.需要打出那个字的时候就用那个实例化这个接口
    在逻辑层只需要调你接口就可以了.
    class Main()
    {
      public static void main(String age[])
      {
         A aB=new B(); 
         A aC=new C();
    //需要那个的时候就去有那个类去实例化A接口
         aB.print();
         aC.print();
      }
    }public interface A
    {
        public void print();
    }public class B implements A
    {
        public void print()
        {
            System.out.println("B");
         }
    }public class C implements A
    {
        public void print()
        {
            System.out.println("C");
         }
    }
      

  11.   

    俺也来凑个热闹。接口主要是针对“实现”来说的,打个比方,接口就象“制定的标准”,而实现呢,就是按这个标准生产的产品。
    比如,你是汽车引擎的标准制定者,你只需要规定尺寸,尾气的排放量等等指标,而不用管生产的过程。你这个标准对2方面有用,一是引擎厂商,二是汽车制造商。引擎厂商按你的标准生产引擎,而汽车制造商按你的标准给引擎留位置。如果这个世界上只有一个引擎厂商,只生产一种引擎,那么你这个标准制定了也是白制定,没用的~。可是世界总是没有那么理想,只要有钱赚,一堆厂家会来生产引擎,这时候你的标准的作用就凸现出来了!对于家用型汽车生产商,它们可以选择价格便宜、功率较小的。而赛车生产商,它们可以选择功率强劲,油耗大的。对于同一款产品,如果汽车生产商黑,它还可以在量产的中途改用更差的引擎,而其他地方不用改。======
    换到程序的领域也是如此,你定义好一个接口,那么对2方面有用,一是实现这个接口的程序员,另一方面是需要用这个实现的人。
    如果你保证用到这个实现的地方,永远不会被修改(不会象黑心厂商那样),那么这个接口就没什么用,还没有你直接用实现类简单。
    ============
    可是世界总是没这么理想,特别是程序的世界里。
    今天,你的实现是针对ORACLE的,你的代码中用到了跟ORACLE特性相关的内容。明天,你的客户可能跟你说:SORRY,ORACLE太贵了,你能不能帮我做成MYSQL的版本?
    为了满足他的需求,你有2种选择:
    1、在以前的实现类上直接做修改。
    2、新做一个实现类,在用到这个实现类的地方改代码为新的实现类。
    =============
    如果你只有一个客户,也保证他不会再要求改回用ORACLE,第一种选择更为简单。可是如果不满足以上2个条件,那么第2种选择更为合适。
    =======
    现在我们以具体的代码来示范。
    (1)假设不用接口,你在用到这个实现的时候,你会这么写代码:
    OracleImpl impl=new OracleImpl();
    如果你把这个实现给多个方法用,那么方法的定义可能是这样:
    void useImpl(OracleImpl impl){}
    -----
    那么当你需要把OracleImpl改成MysqlImpl的时候,你要改3个地方。
    (2)使用接口,你会这么写代码:
    Interface impl=new OracleImpl();
    如果你把这个实现给多个方法用,那么方法的定义可能是这样:
    void useImpl(Interface impl){}
    -----
    那么当你需要把OracleImpl改成MysqlImpl的时候,你只需要改1个地方。假设用到的地方很多,是不是比(1)强很多?但这还是不够!因为如果你有多个实例,那么你需要多个new OracleImpl();,这也需要你改多个地方。
    (3)使用工厂模式
    工厂模式就是把实例的产生的代码集中到一个类中,用这个类来产生实例。假设你定义的静态方法:
    public class ImplFactory{
        public static Interface getImpl(){
             return new OracleImpl();
        }
    }
    在用到的地方,你会这么写代码:
    Interface impl=ImplFactory.getImpl();
    -----
    这样,当你改成MysqlImpl的时候,你是不是只用改工厂类的一个地方?是的!可是这还不够,因为你毕竟还要改代码,有没有不改代码的方法呢?有!
    =========
    比如我们把需要产生的实现类的类名放到一个配置文件中,假定这样写:
    Interface=OracleImpl
    那么我们工厂类可以这样:
    public class ImplFactory{
        public static Interface getImpl(){
             String implClassName=\\此处略去从文件读的代码
             return (Interface)(Class.forName(implClassName).newInstance());
        }
    }
    当你需要改实现类为MysqlImpl的时候,你一行代码都不用改!只改配置文件就好了。======================
    这就是接口的魅力!
    ======================
      

  12.   

    我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581