-5

可能的重复:
什么是多态性?

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

4

2 回答 2

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 类型。

于 2012-12-31T03:41:05.410 回答
1

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

假设您有这个 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();员工数组的每个对象的每个类实现而有所不同

于 2012-12-31T03:49:52.733 回答