Почему в Википедии сказано: «Полиморфизм - это не то же самое, что перегрузка метода или переопределение метода». - PullRequest
6 голосов
/ 27 июля 2010

Я осмотрелся и не смог найти подобного вопроса.

Вот параграф, который я получил из Википедия :

Полиморфизм не совпадает с перегрузкой методаили переопределение метода.Полиморфизм касается только применения конкретных реализаций к интерфейсу или более базовому классу.Перегрузка методов относится к методам, которые имеют одинаковое имя, но разные подписи внутри одного и того же класса.Переопределение метода - это когда подкласс заменяет реализацию одного или нескольких методов его родителя.Ни перегрузка метода, ни переопределение метода сами по себе не являются реализациями полиморфизма.

Может ли кто-нибудь здесь объяснить это более четко, особенно часть "Полиморфизм не то же самое, что переопределение метода"?Я сейчас в замешательстве.Заранее спасибо.

Ответы [ 7 ]

6 голосов
/ 27 июля 2010

Полиморфизм (очень просто) - это возможность использовать производный класс, где ожидается базовый класс:

class Base {

}

class Derived extends Base  {

}

Base v = new Derived(); // OK

Переопределение метода, с другой стороны, это то, как Вики говорит способ изменить поведение метода в производном классе:

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

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

Перегрузка не связана с наследованием, она позволяет определять больше функций с одинаковыми именами, которые отличаются только аргументами, которые они принимают.

3 голосов
/ 27 июля 2010

Вы можете иметь полиморфизм в языке, который не допускает переопределение метода (или даже наследование). например имея несколько разных объектов, реализующих один и тот же интерфейс. Полиморфизм просто означает, что у вас могут быть разные конкретные реализации одного и того же абстрактного интерфейса. Некоторые языки не одобряют или запрещают наследование, но допускают такой полиморфизм в духе программирования с абстракциями.

Теоретически вы могли бы иметь метод переопределения без полиморфизма в языке, который не позволяет отправлять виртуальные методы. В результате вы можете создать новый класс с переопределенными методами, но вы не сможете использовать его вместо родительского класса. Я не знаю ни одного основного языка, который делает это.

2 голосов
/ 27 июля 2010

Перегрузка имеет в одном и том же классе много методов с одинаковыми именами, но с разными параметрами.

Переопределение имеет в унаследованном классе один и тот же метод + параметры базового класса.Таким образом, в зависимости от класса объекта будет вызываться либо базовый метод, либо унаследованный метод.

Полиморфизм - это тот факт, что экземпляр унаследованного класса может заменить экземпляр базового класса,когда задано в качестве параметров.

Например:

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.
  }
}

Видите?Полиморфизация - это тот факт, что один и тот же объект может использоваться как экземпляр своего собственного класса, своего базового класса или даже как интерфейс.

2 голосов
/ 27 июля 2010

Полиморфизм не связан с переопределением методов;речь идет о объектах , определяющих реализацию конкретного процесса.Простой пример - но ни в коем случае не единственный пример - с наследованием:

Роман - это тип Книги.Он имеет большинство тех же методов, и все, что вы можете сделать с книгой, можно сделать с романом.Следовательно, любой метод, который принимает книгу в качестве аргумента, также может иметь дело с романом в качестве аргумента.(Пример будет включать .read (), .write (), .burn ()).Это само по себе , не имея в виду тот факт, что роман может перезаписать метод 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)
1 голос
/ 27 июля 2010

Честно говоря:

Полиморфизм использует множество типов, которые имеют определенные общие черты в реализации one , которым нужны только общие вещи, тогда как в качестве перегрузки метода используется реализация one для каждого типа.

1 голос
/ 27 июля 2010

Полиморфизм относится к тому факту, что экземпляр типа может рассматриваться как любой экземпляр любого из его супертипов. Полиморфизм означает «много форм».

Скажем, у вас был тип по имени Собака. Затем у вас есть тип по имени Spaniel, который наследуется от Dog. Экземпляр спаниеля может использоваться везде, где используется собака, - с ним можно обращаться так же, как с любым другим экземпляром собаки. Это полиморфизм.

Переопределение методов - это то, что подкласс может делать с методами в базовом классе. Собака может содержать метод лая. Спаниель может переопределить этот метод, чтобы обеспечить более конкретную реализацию. Переопределение методов не влияет на полиморфизм - тот факт, что вы переопределили метод Dog в спаниеле, не позволяет вам или не мешает вам относиться к спаниелю как к собаке.

Перегрузка методов - это просто присвоение разным методам, которые принимают разные параметры, одного имени.

Надеюсь, это поможет.

1 голос
/ 27 июля 2010

Когда вы переопределяете метод, вы меняете его реализацию.Полиморфизм будет использовать вашу реализацию или базовую реализацию, в зависимости от вашего языка (поддерживает ли он виртуальные методы?) И в зависимости от созданного вами экземпляра класса.

Перегрузка метода - это нечто другое, это означает использованиетот же метод с другим количеством параметров.

Сочетание этого (переопределение), плюс возможность использовать базовые классы или интерфейсы и все еще вызывать переопределенный метод где-то в цепочке, называется полиморфизмом.

Пример:

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());
    }
}
...