还是关于接口的问题——2个
看了许多关于接口的帖子,我对于接口仍然有两个问题不明白:
1. 接口是如何弥补单一继承之不足的?
2. 接口是如何实现“通信”的?
对于这两个问题,我真的很希望有哪位大哥能够给出实际的例子。如果没有例子,只要能讲得清楚也行,小弟在此磕头了。
------解决方案--------------------1 打个比方,你有一个两相插头的接口,还有一个三相插头的接口,这时你设计一个类,如果你设计的这个类只是继承了某个接口(比如两相插头的接口),那么你这个类只具有你继承的这个接口的接口方法,另一个接口方法(比如三相插头的接口方法)该类是不具有的;但是如果你设计的这个类都实现了那两个接口,那么你这个类就同时具有了两相插头的接口三相插头的接口;这样就弥补了单一继承的不足。
2 不太明白这个问题的意思?你所谓的通信是指什么?你调用接口的方法,不就是跟接口通信吗?
举例
interface InterfaceOne {
void doJobOne();
}
interface InterfaceTwo {
void doJobTwo();
}
public class MyJob implements InterfaceOne, InterfaceTwo {
public static void main(String[] args) {
MyJob mj = new MyJob();
mj.doJobOne();
mj.doJobTwo();
}
public MyJob() {
System.out.println( "constructor ");
}
public void doJobOne() {
System.out.println( "do job one. ");
}
public void doJobTwo() {
System.out.println( "do job two. ");
}
}
------解决方案--------------------所谓通信就是对象之间建立联系,互相交互来完成特定功能,当然,这主要就是靠接口了。
------解决方案--------------------1. 接口是如何弥补单一继承之不足的?
多重继承是不容易管理的复杂,被单一替换了.
实现接口, 没有直接变成了有多重继承的效果..
不用多理会这个问题了.单一继承+实现接口就能了
------解决方案--------------------------------------------
另外,我上机试了一下。比如我希望类B的对象b能够也具有类A的方法,并能够调用该方法,那我直接在类B中申明一个类A的对象,然后在main方法中申明b,这样b不就具有了A的功能了吗?这样不是就可以不用接口了?
------------------------
这如果从设计模式的角度看,可以看作builder模式,相当于你把零散的每个类组合成一个大类,但是这样的模式不适合通用化,除非都是抽象类。
其实,接口的主要目的就是为了通用化,就好象生产零件都要符合国际标准接口一样,比如我有辆车,里面某个零件坏了,这时我用另外一个厂家的零件替换也可以,只要接口是一样的就行;否则,如果接口不一样,我就只能用原来那个厂家的零件,如果原来那个厂家倒闭了,那我的车就报废了。所以,考虑到通用化,生产商就要定义一个标准的零件接口,每个厂商根据这个接口生产自己的零件,这些生产出来的零件就是具体实现该零件接口的子类。由于生产商不同,生产出来的零件也各具特点,比如某厂商的车座是固定的,另一厂商的车座是可以躺下的,但都符合车座的接口标准,所以用户可以根据需要选购不同的车座。这就是接口相同,子类多样化。
同样的,在实际的程序开发中,比如
interface B {
void install();
}
class A {
public void install(B b) {
B.install();
}
}
这样,把A类看作车,B类看作车座,A类要安装车座时,只需要调用B类的install接口就行了,这时A并不关心B是被那个厂商生产的,只要有install接口就行。而其他生产商就可以根据B接口生产出不同的子类B1,B2等等
这样某个人要给车配上车座时就可以这样
class Person {
public static void main(String[] args) {
A a = new A();
B b = new B1(); //这里可以根据实际情况自己选择B1或是B2
a.install(b);
}
}