Что такое полиморфизм, для чего он нужен и как он используется? - PullRequest
515 голосов
/ 23 июня 2009

Что такое полиморфизм, для чего он нужен и как он используется?

Ответы [ 27 ]

8 голосов
/ 14 января 2014

(Я просматривал другую статью о чем-то совершенно ином ... и всплыл полиморфизм ... Теперь я подумал, что знаю, что такое полиморфизм .... но, видимо, не так красиво объяснил ... Хотел записать это где-то .. лучше еще поделюсь ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

читать дальше из этой части:

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

4 голосов
/ 23 июня 2009

Термин полиморфизм происходит от:

поли = много

морфизм = способность меняться

В программировании полиморфизм - это «техника», которая позволяет вам «смотреть» на объект как на предмет более чем одного типа. Например:

Объект ученика - это также объект личности. Если вы «посмотрите» (то есть на актера) на студента, вы, вероятно, можете попросить студенческий билет. Вы не можете всегда делать это с человеком, верно? (человек не обязательно является студентом, поэтому может не иметь студенческого билета). Однако у человека, вероятно, есть имя. Студент тоже.

Итог, «взгляд» на один и тот же объект с разных «углов» может дать вам разные «перспективы» (то есть разные свойства или методы)

Так что эта техника позволяет создавать вещи, на которые можно «смотреть» под разными углами.

Почему мы используем полиморфизм? Для начала ... абстракция. На данный момент должно быть достаточно информации:)

4 голосов
/ 23 июня 2009

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

  • Перегрузка функций: определение нескольких функций с одинаковым именем и различными типами параметров, такими как sqrt (float), sqrt (double) и sqrt (complex). В большинстве языков, которые это допускают, компилятор автоматически выбирает правильный тип передаваемого в него аргумента, поэтому это полиморфизм во время компиляции.

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

  • Шаблоны: функция некоторых ОО-языков, посредством которой функция, класс и т. Д. Могут параметризоваться по типу. Например, вы можете определить общий шаблонный класс «list», а затем создать его экземпляр как «список целых чисел», «список строк», возможно, даже «список списков строк» ​​или тому подобное. Как правило, вы пишете код один раз для структуры данных произвольного типа элемента, и компилятор генерирует его версии для различных типов элементов.

3 голосов
/ 23 июня 2009

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

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

Если вы слушаете музыкальное произведение, у вас есть ссылка на сценарий, например, «Fuga and Tocata» Баха и каждый музыкант, исполняющий его, по-своему полиморфизируют.

Это просто пример возможного дизайна (на Java):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}
3 голосов
/ 03 октября 2016

Полиморфизм - это способность объекта принимать различные формы. Наиболее распространенное использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса. В этом примере, написанном на Java, у нас есть три типа транспортных средств. Мы создаем три разных объекта и пытаемся запустить их колеса методом:

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

Результат:

The Result

Для получения дополнительной информации, пожалуйста, посетите https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java. Я надеюсь, что это помогает.

3 голосов
/ 16 июня 2011

Я предоставил общий обзор полиморфизма для другого вопроса:

Полиморфизм в c ++

Надеюсь, это поможет. Выписка ...

... это помогает начать с простого теста и определения [полиморфизма]. Рассмотрим код:

Type1 x;
Type2 y;

f(x);
f(y);

Здесь f() предназначен для выполнения некоторой операции, и в качестве входных значений ему присваиваются значения x и y. Чтобы быть полиморфным, f() должен иметь возможность работать со значениями как минимум двух разных типов (например, int и double), находя и выполняя код, соответствующий типу.

(продолжение на Полиморфизм в c ++ )

3 голосов
/ 08 апреля 2014

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

2 голосов
/ 06 ноября 2015

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

например, Shape - это интерфейс, он имеет Square , Circle , Diamond подтипов. теперь у вас есть объект Square, вы можете автоматически переместить квадрат в форму, потому что квадрат - это форма. Но когда вы пытаетесь уменьшить Shape to Square, вы должны выполнить явное приведение типов, потому что вы не можете сказать, что Shape is Square, это может быть и Circle. поэтому вам нужно вручную привести его с кодом, подобным Square s = (Square)shape, что, если фигура - Круг, вы получите java.lang.ClassCastException, потому что Круг - не Квадрат.

2 голосов
/ 06 мая 2015

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

Рассмотрим человека X.

Он только один человек, но он действует как многие. Вы можете спросить, как:

Он сын своей матери. Друг своим друзьям. Брат его сестре.

2 голосов
/ 17 апреля 2015

Полиморфизм:

Разное исполнение в зависимости от экземпляра класса, а не от типа ссылочной переменной.

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

...