【问题标题】:What is the use in polymorphism? (Java) [duplicate]多态性有什么用? (Java)[重复]
【发布时间】:2012-12-15 08:21:29
【问题描述】:

可能重复:
What is Polymorphism?

我目前正在学习 Java 中的多态性,但我无法理解它有什么用处。我经常看到人们说如果你想制作一个圆形或方形,那么你会创建一个名为“shape”的超类,这样你就可以调用单独的圆形和方形类,但为什么不直接创建单独的对象呢?

【问题讨论】:

  • 这个问题已经问了很多次了,请考虑使用搜索。
  • 就像我说的,我不明白其他答案。
  • 其他答案让您感到困惑吗?如果你不告诉我们,我们怎么知道该说什么?如果您拒绝澄清您的问题,如何防止重复之前已明确说明的内容?
  • 我知道 lua,但是当我进入这个问题时,我不明白,因为还有其他方法可以做同样的事情,但人们说这非常重要。
  • 生物学中的多态性是指生物体或物种可以具有许多不同形式或阶段的能力。在面向对象编程中。编程也有同样的概念,Objecting 有多种形式。

标签: java polymorphism


【解决方案1】:

如果你的圆形和方形有一个方法render(),那么有人可以像这样实现一个对象渲染器:

class Renderer {
    Canvas c;

    public Renderer(Canvas c) {
        this.c = c;
    }

    public void draw(Shape shape) {
        shape.render(c);
    }
}

因此,渲染器可以在任何 Canvas(或 Canvas 的子类)、您可以提供的任何 Shape 上进行绘制。

不同 - 没有多态性 - 你一定写过类似的东西:

class Renderer {
    Canvas c;

    public Renderer(Canvas c) {
        this.c = c;
    }

    public void draw(Circle circle) {
        circle.render(c);
    }

    public void draw(Square square) {
        square.render(c);
    }

    public void draw(Triangle square) {
        triangle.render(c);
    }
    // and so on...
}

那么你可能会想,如果我有不同类型的画布怎么办? PaperCanvas、WoodCanvas、ClothCanvas 等等……渲染器和 Shapes 仍然可以使用抽象 Canvas 与该对象进行交互,而无需了解实现细节以及它们可能被绘制到的所有可能的 Canvas 类型。

【讨论】:

  • 好的,有道理。但是每个形状的那些单独的方法必须在单独的类中。那么为什么不创建一个包含所有方法的类,然后调用该类中的每个方法呢?
  • @nPwn - 自己尝试一下……看看会发生什么。你能保持封装吗?当您决定实现(例如)Pentagon 类时,需要更改多少类?
【解决方案2】:

在生物学中,多态性是指生物体或物种可以具有许多不同形式或阶段的能力。在面向对象编程中。编程也有同样的概念,一个对象可以以多种形式存在。

假设你有这个 Employee 类。

public class Employee{
   public int computeSalary(){
       //How would you compute the salary of an average employee
    }
}

接下来是一个名为 BasePlusComission Employee 的子类

 public class BasePlusCommissionEmployee extends Employee{
          public int computeSalary(){
               //Commision employee salary computation + Base Employee salary computation
            }
}

你有这个 CommissionEmployee

 public class CommissionEmployee extends Employee{
              public int computeSalary(){
                   //Commision employee salary computation
                }
    }

现在,我们要多态地处理这个雇员的计算。我们可以做

public void computeEmployeeSalary(Employee emp){
     emp.computeSalary();
}

此方法将接收任何类型的 Employee 对象(这意味着我们可以传递 Employee 对象的子类)。一旦你传递了它,它将计算传递的员工(参数),并且它的 computeSalary() 将被调用,

即使您传递了 BasePlusCommission Employee 或 CommissionEmployee,由于 Dynamic 方法查找,它仍会根据其实现计算其薪水。

另一个更清晰的解释。您可以创建一组或一组员工。

Employee[] employees = { new BasePlusComissionEmployee(), new CommissionEmployee,new Employee()};

并且您希望这些对象计算他们的薪水。你可以像这样多态地处理它们的计算

for(int i = 0; i < employees.length;i++){
    employees[i].computeSalary();
}

请注意,尽管数组声明是 Employee,但它们的 computeSalary() 实现将根据员工数组的每个对象的 computeSalary(); 的每个类实现而有所不同

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多