变量声明为接口类型,有什么好处!!
- Java code
//A实现IA接口public class A implements IA { void m() {}}//A1继承Apublic class A1 extends A { void aaaa1(){}}//A2继承Apublic 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继承Apublic class A1 extends A { void aaaa1(){}}//A2继承Apublic 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(); //这里是调用子类自己的方法,体现不出意义 }}