日期:2014-05-20  浏览次数:20677 次

变量声明为接口类型,有什么好处!!
Java code

//A实现IA接口
public class A implements IA {
  void m() {}
}

//A1继承A
public class A1 extends A {
  void aaaa1(){}
}
//A2继承A
public class A2 extends A {
  void aaaa2(){}
}

//包含有A1、A2这些IA的实现类的一个包租婆类
public class BaoZuPo {
  private IA a1;
  private IA a2;
  ……
  //get set 方法略
}

//经常遇到的情况:
public class Test {
   void test() {
     A1 a1 = (A1)BaoZuPo.getA1();
     a1.aaaa1();
   //类似的
    A2 a2 = (A2)BaoZuPo.getA2();
    a2.aaaa2();
  }
}


我对接口的简单印象是:方便更换不同的实现。。。仅此而已
但与以上test里的代码联系不起来,那个test里,倒是一次次地把接口类型强转为真实类型,然后调用真实类型独有的方法,早知道这样,那个包租婆类里,a1、a2就声明为真实类型不就好了吗,省得强转了啊?它非声明为接口类型,意义在哪里?
求解惑……

------解决方案--------------------
你这段代码体现不出接口的意义,因为没有用到接口的(共同)方法,只是调用不同子类的自己的方法
看看以下这段代码的区别
Java code
//A实现IA接口
public class A implements IA {
    void m() {}
}

//A1继承A
public class A1 extends A {
    void aaaa1(){}
}
//A2继承A
public class A2 extends A {
    void aaaa2(){}
}

//包含有A1、A2这些IA的实现类的一个包租婆类
public class BaoZuPo {
    private IA a1;
    private IA a2;
    ……
    //get set 方法略
}

//经常遇到的情况:
public class Test {
    void test() {
        IA a1 = BaoZuPo.getA1();
        a1.m(); //这里才是意义所在
        ((A1)a1).aaaa1(); //这里是调用子类自己的方法,体现不出意义
        //类似的
        IA a2 = BaoZuPo.getA2();
        a2.m(); //这里才是意义所谓
        ((A2)a2).aaaa2(); //这里是调用子类自己的方法,体现不出意义
    }
}