Почему Википедия говорит, что “Полиморфизм не является тем же как перегрузкой метода или переопределением метода”.

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

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

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

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

6
задан Hai Minh Nguyen 27 July 2010 в 12:33
поделиться

7 ответов

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

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 */ }
}

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

6
ответ дан 8 December 2019 в 14:39
поделиться

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

Роман - это тип книги. Он имеет большинство тех же методов, и все, что можно сделать с книгой, можно сделать и с романом. Поэтому любой метод, принимающий в качестве аргумента книгу, может работать и с романом. (В качестве примера можно привести .read(), .write(), .burn()). Это, само по себе, не относится к тому факту, что Novel может перезаписать метод 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)
2
ответ дан 8 December 2019 в 14:39
поделиться

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

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

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

Например. :

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
ответ дан 8 December 2019 в 14:39
поделиться

Откровенно:

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

1
ответ дан 8 December 2019 в 14:39
поделиться

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

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

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

Example:

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());
    }
}
1
ответ дан 8 December 2019 в 14:39
поделиться

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

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

3
ответ дан 8 December 2019 в 14:39
поделиться

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

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

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

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

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

1
ответ дан 8 December 2019 в 14:39
поделиться