假设我们有两个类, Tiger并且Aeroplane.这两种类型的一个共同点是速度.我知道,这将是不合逻辑创建一个超类ClassWithSpeed,然后派生子类Aeroplane,并Tiger从它.相反,它是最好创建一个包含方法的接口speed(),然后实现它Aeroplane和Tiger.我明白了.但是,如果没有接口,我们可以做同样的事情.我们可以定义方法speed()中Aeroplane和方法speed()的Tiger.唯一(也许是非常大的)缺陷是我们无法"到达" 接口引用的对象Tiger并Aeroplane通过接口引用.
我是Java和OOP的初学者,如果有人向我解释接口的作用,我将非常感激.干杯!
may*_*Van 71
它的:
public int howFast(Airplane airplane) {
return airplane.speed();
}
public int howFast(Tiger tiger) {
return tiger.speed();
}
public int howFast(Rocket rocket) {
return rocket.speed();
}
public int howFast(ThingThatHasntBeenInventedYet thingx) {
// wait... what? HOW IS THIS POSSIBLE?!
return thingx.speed();
}
...
Run Code Online (Sandbox Code Playgroud)
VS
public int howFast(Mover mover) {
return mover.speed();
}
Run Code Online (Sandbox Code Playgroud)
现在,想象一下howFast将来要回去改变所有这些功能.
接口还是不行,每个类都必须实现或继承该speed()方法.界面允许您更轻松地使用这些不同的类,因为它们每个都承诺以某种方式运行.你会打电话speed(),他们会返回一个int,所以你不必为每个可能的类编写单独的方法.
当您发现由于相对论物理学的突破而需要以不同的方式处理速度时,您只需要更新调用的方法speed().当你的曾孙女为一个班级写作时HyperIntelligentMonkeyFish,她不必拆解你的古代二进制文件并进行修改,以便你的代码可以监视和控制她的突变军队.她只需要宣布这一点HyperIntelligentMonkeyFish implements Mover.
接口允许Java,因为它是静态类型的,可以解决多种继承限制,达到语言设计者认为值得的程度.
在动态语言(如Python,Ruby等)中,您可以在任意对象上调用speed方法,并在运行时发现它是否存在.
另一方面,Java是静态类型的,这意味着编译器必须同意该方法将提前存在.在不共享共同祖先的类上执行此操作的唯一方法是,只能使用Object,这是一个接口.
由于对象可以实现任意数量的接口,这意味着您可以获得多重继承的优点(可以为不同方法构建多个不同对象的单个对象)而没有缺点(两个超类中的冲突实现).
使用Java 8,该语言的设计者得出结论,没有任何实现的接口过于严格(他们不喜欢我的解决方案 ;-)),因此它们允许默认实现,从而扩展了接口的多继承选项,同时仍试图通过一组复杂的优先规则来避免冲突的实现问题,以便有一个明确的默认实现来执行.
我试图通过以下示例解释接口的优点 -
假设您有另一个类,您需要使用老虎或飞机作为参数.因此,通过使用接口,您可以使用
someObject.someMethod(ClassWithSpeed)
Run Code Online (Sandbox Code Playgroud)
但如果你不使用界面,你可以使用
someObject.someMethod(Tiger)
someObject.someMethod(AeroPlane)
Run Code Online (Sandbox Code Playgroud)
那你该怎么办?你可能的答案就像,"I will use two overloaded method".
到目前为止,这是可以的,但是
假设您需要添加更多选项(比如汽车,自行车,兔子,乌龟......等等).那么你将如何改变你现有的代码呢?你需要改变很多东西..
上面的整个例子只有一个目的.也就是说
"我们需要界面来创建更好,可重用且适当的面向对象的设计"
NB
定义接口允许您定义不仅适用于Airplane和Tiger的方法,还可以定义共享相同接口的其他类.
例如,假设您的接口是IObjectWithSpeed.然后你可以定义一个这样的方法 - 在一个操作IObjectWithSpeed对象的类中.
public double calculateSecondsToTravel( IObjectWithSpeed obj, double distance ) {
return distance / obj.getSpeed();
}
Run Code Online (Sandbox Code Playgroud)
接口允许我们满足开放/封闭原则 - 打开扩展,但关闭修改.上面的方法的单个实现不需要修改,因为定义了实现IObjectWithSpeed的新类.
| 归档时间: |
|
| 查看次数: |
10277 次 |
| 最近记录: |