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

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

Ответы [ 27 ]

2 голосов
/ 02 марта 2013

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

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

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

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

Выходы:

This is a fraction: 1/2
This is a complex number: 1 + 2i

Некоторые другие ответы, по-видимому, подразумевают, что полиморфизм используется только в сочетании с наследованием; например, возможно Fraction и ComplexNumber оба реализуют абстрактный класс с именем Number, который имеет метод display(), который затем обязаны реализовать Fraction и ComplexNumber. Но вам не нужно наследование , чтобы воспользоваться преимуществами полиморфизма.

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

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

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

1 голос
/ 21 ноября 2013

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

Помните, что каждый класс должен быть сохранен в отдельных файлах.

Следующий код иллюстрирует полиморфизм:

Суперкласс:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

Отец, подкласс:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

Ребенок, другой подкласс:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

Метод выполнения, ссылки на родительский класс для запуска:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

Обратите внимание, что каждый класс должен быть объявлен в отдельных * .java файлах. Код должен скомпилироваться. Также обратите внимание, что вы можете постоянно использовать maidenName и familyTree дальше вниз. Это понятие полиморфизма. Концепция наследования также рассматривается здесь, где может использоваться один класс или он определяется подклассом.

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

1 голос
/ 29 января 2017

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

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

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

Смотри также:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

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

В объектно-ориентированных языках полиморфизм позволяет обрабатывать и обрабатывать различные типы данных через один и тот же интерфейс. Например, рассмотрим наследование в C ++: Класс B является производным от класса A. Указатель типа A * (указатель на класс A) может использоваться для обработки объекта класса A И объекта класса B.

0 голосов
/ 12 апреля 2017

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

При использовании полиморфизма модуль высокого уровня не зависит от модуля низкого уровня. Оба зависят от абстракций. Это помогает нам применять принцип инверсии зависимостей (https://en.wikipedia.org/wiki/Dependency_inversion_principle).

Здесь я нашел приведенное выше определение. Примерно через 50 минут видео инструктор объясняет вышеизложенное. https://www.youtube.com/watch?v=TMuno5RZNeE

0 голосов
/ 24 июня 2010

Полиморфизм в терминах кодирования - это когда ваш объект может существовать в виде нескольких типов посредством наследования и т. Д. Если вы создаете класс с именем «Shape», который определяет количество сторон вашего объекта, то вы можете затем создать новый класс, который наследует его таким образом. как "Квадрат". Когда вы впоследствии создадите экземпляр «Квадрата», вы можете затем повернуть его назад и вперед из «Формы» в «Квадрат», как требуется.

...