Подтвердить что ты не робот

Может ли кто-нибудь объяснить мне Полиморфизм?

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

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

4b9b3361

Ответ 1

Возможно, проще всего начать с не-компьютерной аналогии.

Подумайте, если вы сказали кому-то: "Пойдите в магазин и купите часть своей любимой еды на ужин".

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

Если вы сказали это своей жене, она, вероятно, поедет в магазин, воспользуется карточкой для оплаты еды, и вместо этого вы можете есть курицу Cordon Bleu с Шардоне.

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

Конечно, когда вы программируете, для большинства из них требуется спецификация, которая будет намного более подробной и однозначной. Однако общая идея остается прежней. В приведенном выше сценарии у вас может быть базовый класс person (или интерфейс), в котором определены методы типа go to store и select favorite food и pay for purchase. Тогда у вас будут такие реализации, как adult и teenager, каждый из которых определил свой собственный способ перехода в магазин, выбор любимого питания и оплату покупки. Эти методы будут полиморфными, поскольку каждая реализация будет иметь свой собственный способ выполнения команды более высокого уровня, которую вы дали.

Ответ 2

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

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

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

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

Ответ 3

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

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

В качестве примера можно использовать массивы. Могут быть две возможные две реализации: одна, когда массив разрежен (много нулей) и один, когда массив заполнен. Вместо того, чтобы использовать один класс direct, он определял бы интерфейс класса массива, а затем в контексте выбирал бы лучшую реализацию. В качестве примера можно привести следующий код (стиль С++) целочисленного массива:

 class arrayInterface{
    ...
    virtual int getElement(elementPosition)=0
    ...
}

class sparseArray : public arrayInterface{
    ...
    virtual int getElement(elementPosition){
        implementation
    }
    ...
}

class fullArray : public arrayInterface{
    ...
    virtual int getElement(elementPosition){
        implementation
    }
    ...
}

main(){
    arrayInterface* array =  new fullArray();
    // this uses now the implementation specified by fullArray
    int element = array->getElement(10)

    delete array;
    array = new sparseArray
    // this uses now the implementation specified by sparseArray
    int element = array->getElement(10)

}