当我开始寻找多态性的好处,我发现这个这里的问题。 但在这里我无法找到我的答案。 让我来告诉我要找到什么。 这里我有一些类:
class CoolingMachines{
public void startMachine(){
//No implementationion
}
public void stopMachine(){
//No implementationion
}
}
class Refrigerator extends CoolingMachines{
public void startMachine(){
System.out.println("Refrigerator Starts");
}
public void stopMachine(){
System.out.println("Refrigerator Stop");
}
public void trip(){
System.out.println("Refrigerator Trip");
}
}
class AirConditioner extends CoolingMachines{
public void startMachine(){
System.out.println("AC Starts");
}
public void stopMachine(){
System.out.println("AC Stop");
}
}
public class PolymorphismDemo {
CoolingMachines cm = new Refrigerator();
Refrigerator rf = new Refrigerator();
}
现在,这里我在Demo类创建了两个对象,并且是引用Refrigerator
。 我已经完全了解,从rf
对象我可以调用trip()
的方法Refrigerator
,但该方法将被隐藏在cm
对象。 现在,我的问题是为什么要使用多态,为什么我应该使用
CoolingMachines cm = new Refrigerator();
当我与OK
Refrigerator rf = new Refrigerator();
是多态对象的效率是良好的重量或轻? 什么是这两个对象之间的基本目的和区别? 是否有任何区别cm.start();
和rf.start()
Answer 1:
当你处理列表是很有用的......这个简单例子:
List<CoolingMachines> coolingMachines = ... // a list of CoolingMachines
for (CoolingMachine current : coolingMachines) {
current.start();
}
或者当你希望允许的方法用的任何子类工作CoolingMachines
Answer 2:
在你和了解具体的类真的好吗情况下,有没有好处。 然而,在许多情况下,你要能够编写代码,只知道基类或接口。
例如,看Iterables
在番石榴 -这是一个很大的这(大部分)不关心什么实现的方法Iterable
正在使用。 你真的希望所有,对于每一个单独执行的代码?
在这里您可以代码以抽象基类或接口,你让自己在以后使用共享相同的公共API等实现,但可以有不同的实现。 即使你只想要一个单一的生产实施,您很可能希望测试替代实现。 (所述的程度,其适用在很大程度上取决于所讨论的类)。
Answer 3:
因为以后如果要使用AirConditioner
,而不是Refrigerator
冷却,然后只需要更改代码CoolingMachines cm = new AirConditioner();
Answer 4:
要使用的原因
CoolingMachines cm = new Refrigerator();
是,你可以很容易地以后使用不同的CoolingMachines
。 你只需要改变的代码,一个线和代码仍然可以工作(因为它只会使用方法其余CoolingMachines
,这比在特定的机器,更普遍的如Refrigerator
)。
所以对于一个特定实例Refrigerator
,调用cm.start();
和rf.start()
的工作方式相同,但cm
也可能是不同的CoolingMachines
对象。 而该对象可以有不同的实现的start()
。
Answer 5:
第一个答案:
使用多态的方法overridding和方法重载。 在不同的类使用的其它类的方法则两个选项:第一种方法继承的,在写入第二方法。 这里延伸接口:使用它们,或FPGA实现方法,包括:逻辑写。 多态性用于方法,类继承。
第二个答案:
是否有任何区别cm.start();
和rf.start();
?
是的,无论是相对于彼此完全不同的对象。 不要创建界面对象因为Java支持`吨界面对象。 用于接口和第二对冰箱类创建第一个对象。 现在第二个对象。
Answer 6:
最普遍的回答你的问题的通用部分(?我为什么要使用多态)是多态性实现几个关键的面向对象的设计原则,例如:
代码重用:通过将是共同的所有的“冷却机”中的任何代码到冷却机,你只需要编写一次代码和任何编辑代码涓滴瞬间。
抽象:人脑只能跟踪这么多的东西,但他们善于类别和层次。 这有助于了解情况,在一个大的计划。
封装:每个类隐藏了它在做什么细节,只建立了基类的接口上。
关注点分离:很多面向对象编程的是有关分配责任。 谁去负责呢? 专门关注可以进去子类。
所以多态性是就在大OO画面的一部分,原因使用它有时只意义,如果你要尝试做“真正的”面向对象编程。
Answer 7:
多态性的一个简单的例子是,可以有coolingMachines阵列,其中元件0是refrigator和元件1是一种空气调节器等...
你不需要预制棒任何检查或确认哪个对象,以调用跳闸或启动等被处理
从用户采取投入,不得不遍历所有的对象,并调用类似的功能时,这是一个很大的好处
Answer 8:
我举一个简单易懂的例子。 比方说,你有一些JSON
{"a":[1,2],"sz":"text", "v":3, "f":1.2}
现在让我们说编程要列出名称,类型和值。 而不必(对于数组,字符串SZ,等)的开关()为每种类型的你可以有一个基本类型,并调用一个函数,它的工作。 这也是更多的CPU比使用一个开关,一个十几种高效。
再就是插件,库和对界面的原因外来代码。
Answer 9:
使用你的对象多态也有助于建立工厂或相关类是如何的重要组成部分的家庭工厂设计模式实现。 下面是多态工厂的一个非常基本的例子:
public CoolingMachine CreateCoolingMachines(string machineType)
{
if(machineType == "ref")
return new Refrigerator();
//other else ifs to return other types of CoolingMachine family
}
调用上述代码的使用:
CoolingMachine cm = CreateCoolingMachine("AC"); //the cm variable will have a reference to Airconditioner class which is returned by CreateCoolingMachines() method polymorphically
另外,假设你有一个方法,下面使用具体类参数Refrigerator
:
public void UseObject(Refrigerator refObject)
{
//Implementation to use Refrigerator object only
}
现在,如果你改变上述实施UseObject()
方法来使用最普通的基类的参数,调用代码会得到好处传递,然后可以在方法内部使用的任何参数多态UseObject()
public void UseObject(CoolingMachine coolingMachineObject)
{
//Implementation to use Generic object and all derived objects
}
以上代码现在更扩展其他子类可以在以后添加到家庭CoolingMachines的,而这些新的子类的对象也将与现有的代码工作。
文章来源: Benefit of Polymorphism [closed]