为什么维基百科说“多态性与方法重载或方法重写不同”。

时间:2010-07-27 12:33:50

标签: oop polymorphism overloading override

我环顾四周,找不到任何类似的问题。

以下是我从Wikipedia获得的段落:

多态性与方法重载或方法重写不同。多态性仅涉及将特定实现应用于接口或更通用的基类。方法重载是指在同一个类中具有相同名称但签名不同的方法。方法重写是子类替换其父级方法中的一个或多个的实现。方法重载和方法重写都不是多态的实现。

这里的任何人都可以更清楚地解释一下,尤其是“多态性与方法覆盖不同”这一部分吗?我现在很困惑。提前谢谢。

7 个答案:

答案 0 :(得分:6)

多态性(非常简单地说)可以使用期望基类的派生类:

class Base {

}

class Derived extends Base  {

}

Base v = new Derived(); // OK

另一方面,方法覆盖就像Wiki所说的一种改变派生类中方法行为的方法:

class Shape  {
  void draw() { /* Nothing here, could be abstract*/ }
}

class Square extends Shape  {
  @Override
  void draw() { /* Draw the square here */ }
}

重载与继承无关,它允许定义更多具有相同名称的函数,这些函数仅在它们所采用的参数中有所不同。

答案 1 :(得分:3)

您可以在不允许方法覆盖(甚至继承)的语言中使用多态。例如通过让几个不同的对象实现相同的接口。多态性只意味着您可以拥有相同抽象接口的不同具体实现。有些语言不鼓励或不允许继承,但允许这种多态性符合抽象编程的精神。

理论上,在不允许虚方法调度的语言中,您也可以在没有多态的情况下重写方法。结果是您可以使用重写方法创建一个新类,但是您将无法使用它来代替父类。我不知道有任何主流语言可以做到这一点。

答案 2 :(得分:2)

多态性不是关于被覆盖的方法;它是关于对象确定特定进程的实现。一个简单的例子 - 但绝不是唯一的例子 - 是继承:

小说是一种书。它有大多数相同的方法,你可以对一本书做的一切也可以用于小说。因此,任何接受Book作为参数的方法也可以将Novel作为参数处理。 (示例包括.read(),. write(),. bur())。这是本身,而不是指Novel可以覆盖Book方法的事实。相反,它指的是抽象的一个特征。如果教授指定要阅读的书籍,他/她并不关心你如何阅读它 - 只是你这样做。类似地,调用程序不关心如何读取类型为Book的对象,只是它是。如果对象是小说,它将被视为小说。如果它不是一本小说但仍然是一本书,它将被视为一本书。

图书:

private void read(){

#Read the book.
}

小说:

private void read(){

#Read a book, and complain about how long it is, because it's a novel!

}

重载方法只是指两个具有相同名称但参数数量不同的方法。例如:

writeNovel(int numPages, String name)

writeNovel(String name)

答案 3 :(得分:2)

在同一个类中,重载具有许多具有相同名称但不同参数的方法。

重写是在继承的类中使用相同的方法+基类的参数。因此,根据对象的类,将调用基本方法或继承的方法。

多态性是这样一个事实:当作为参数给出时,继承类的实例可以替换基类的实例。

E.g。 :

class Shape {
  public void draw() {
    //code here
  }
  public void draw(int size) {
    //this is overloading 
  }
}

class Square inherits Shape {
  public void draw() {
    //some other code : this is overriding
  }

  public void draw(color c) {
    //this is overloading too
  }
}

class Work {
  public myMethod(Shape s) {
    //using polymophism, you can give to this method
    //a Shape, but also a Square, because Square inherits Shape.
  }
}

看到了吗? 多态变形是这样一个事实:同一个对象可以用作它自己的类的实例,它的基类,甚至可以用作接口。

答案 4 :(得分:1)

覆盖方法时,可以更改其实现。多态性将使用您的实现或基本实现,具体取决于您的语言(它是否支持虚方法?)并取决于您创建的类实例。

重载方法是另一回事,它意味着使用相同方法使用不同数量的参数。

这个(重写)的组合,加上使用基类或接口的可能性,仍然在链上的某个地方调用override方法,称为多态。

示例:

interface IVehicle
{
    void Drive();
}

class Car : IVehicle
{
    public Drive() { /* drive a car */ }
}

class MotorBike : IVehicle
{
    public Drive() { /* drive a motorbike */ }
}

class Program
{
    public int Main()
    {
        var myCar = new Car();
        var myMotorBike = new MotorBike();
        this.DriveAVehicle(myCar);        // drive myCar
        this.DriveAVehicle(myMotorBike);  // drive a motobike
        this.DriveAVhehicle();            // drive a default car
    }

    // drive any vehicle that implements IVehicle
    // this is polymorphism in action
    public DriveAVehicle(IVehicle vehicle)
    {
       vehicle.Drive();
    }

    // overload, creates a default car and drives it
    // another part of OO, not directly related to polymorphism
    public DriveAVehicle()
    {
        // typically, overloads just perform shortcuts to the method
        // with the real implemenation, making it easier for users of the class
        this.DriveAVehicle(new Car());
    }
}

答案 5 :(得分:1)

多态性指的是一个类型的实例可以像任何其超类型的任何实例一样被处理。多态性意味着“多种形式”。

假设您有一个名为Dog的类型。然后你有一个名为Spaniel的类型,它继承自Dog。只要使用了Dog,就可以使用Spaniel的一个实例 - 它可以像任何其他Dog实例一样对待。这是多态性。

方法重写是子类可以对基类中的方法执行的操作。狗可能含有树皮法。 Spaniel可以覆盖该方法以提供更具体的实现。重写方法不会影响多态性 - 你在Spaniel中覆盖Dog方法的事实不会使你或者阻止你像狗一样对待西班牙猎犬。

方法重载只是提供不同方法的行为,这些方法使用不同的参数同名。

我希望有所帮助。

答案 6 :(得分:1)

坦率地说:

多态性使用多种类型,这些类型在一个实现中具有特定的共同点,只需要常见的东西,其中方法重载使用一个实施每种类型。