多态性的好处

kha*_*han 70 java oop polymorphism java-ee

当我开始寻找多态性的好处时,我在这里找到了这个问题.但在这里我无法找到答案.让我告诉我想找到什么.这里我有一些课程:

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();
}
Run Code Online (Sandbox Code Playgroud)

现在我在Demo类中创建了两个对象,并且是对它的引用Refrigerator.我完全理解从rf对象我可以调用trip()方法Refrigerator,但该方法将被隐藏为cm对象.现在我的问题是为什么我应该使用多态或我为什么要使用

CoolingMachines cm = new Refrigerator();
Run Code Online (Sandbox Code Playgroud)

当我没事的时候

Refrigerator rf = new Refrigerator();
Run Code Online (Sandbox Code Playgroud)

多态对象的效率是好还是重量轻?这两个对象的基本目的和区别是什么?有什么区别cm.start();rf.start()

pgr*_*ras 71

处理列表时很有用......一个简短的例子:

List<CoolingMachines> coolingMachines = ... // a list of CoolingMachines 
for (CoolingMachine current : coolingMachines) {
    current.start();
}
Run Code Online (Sandbox Code Playgroud)

或者当您想允许方法使用任何子类时 CoolingMachines

  • 这显然只是它如何有用的一个例子.基本上,您可以拥有通用API. (21认同)

Jon*_*eet 58

如果您对了解具体课程感到满意,那就没有任何好处.但是,在许多情况下,您希望能够编写只知道基类或接口的代码.

例如,IterablesGuava中查看- 这是很多方法(大多数)不关心Iterable正在使用的实现.您是否真的希望每个实现单独使用所有代码?

可以编写抽象基类或接口的地方,您可以在以后使用共享相同公共API但可能具有不同实现的其他实现.即使您只需要单个生产实现,您也可能需要其他实现进行测试.(这种适用的程度在很大程度上取决于所讨论的课程.)

  • 然后让我们开始使用依赖注入之类的东西.基于接口的编程具有许多优点. (4认同)
  • @jcolebrand,就像测试接口而不是实现一样.然后,您的单元测试不关心数据是从数据库,平面文件还是空气中提取的.集成测试应该,但这是一个不同的故事;) (4认同)

Nav*_*een 29

因为以后如果要使用AirConditioner而不是Refrigerator冷却,那么只需要更改的代码就是CoolingMachines cm = new AirConditioner();


Sim*_*ser 17

你想要使用的原因

CoolingMachines cm = new Refrigerator();
Run Code Online (Sandbox Code Playgroud)

是你以后可以轻松使用不同的CoolingMachines.您只需要更改那一行代码,其余代码仍然可以工作(因为它只使用CoolingMachines比特定机器更通用的方法,例如a Refrigerator).

因此,对于特定的实例Refrigerator,调用cm.start();rf.start()工作方式相同,但cm也可能是不同的CoolingMachines对象.并且该对象可以具有不同的实现start().


小智 7

第一个答案:

使用多态来进行方法重写和方法重载.其他类方法在不同的类中使用,然后有两个选项:第一个方法继承,第二个方法重写.这里扩展接口:使用它们,或者实现方法:逻辑写入它们.多态性用于方法,类继承.

第二个答案:

有什么区别cm.start();rf.start();

是的,两者都是彼此完全不同的对象.不要创建接口对象,因为Java不支持接口对象.为接口创建第一个对象,为Refrigerator类创建第二个对象.第二个目标.

  • 让我向你介绍我最亲密的两个朋友,"Shift"和"Enter".欢迎来到我们的社区,但在这里我们喜欢格式化的东西,而不是盲目地打字.此外,我需要您查看我所做的更改,并确保他们保留您的帖子的意图.随意编辑.我认为你在陈述中犯了_some_错误,但我不完全确定. (7认同)

Scr*_*ffy 5

对问题的一般部分(我为什么要使用多态?)的最一般的答案是多态性实现了一些关键的面向对象设计原则,例如:

  • 代码重用:通过将所有"冷却机器"共有的代码放入冷却机器中,您只需编写一次该代码,对该代码的任何编辑都会立即流下.

  • 抽象:人类的大脑只能跟踪这么多东西,但他们擅长类别和层次结构.这有助于了解大型计划中发生的事情.

  • 封装:每个类隐藏它正在做的事情的细节,并且只是在基类的接口上构建.

  • 关注点分离:很多面向对象的编程都是关于分配责任的.谁将负责这一点?专门的问题可以在子类中进行.

因此,多态性只是更大的oo图片的一部分,并且使用它的原因有时只有在你尝试"真正的"编程时才有意义.