Возможный дубликат:
Попробуйте описать полиморфизм так легко, как вы можете
Я никогда не мог полностью понять, что такое полиморфизм. Может ли кто-нибудь объяснить, возможно, используя пример, что это такое и как он работает? Просто основы.
Возможный дубликат:
Попробуйте описать полиморфизм так легко, как вы можете
Я никогда не мог полностью понять, что такое полиморфизм. Может ли кто-нибудь объяснить, возможно, используя пример, что это такое и как он работает? Просто основы.
Возможно, проще всего начать с не-компьютерной аналогии.
Подумайте, если вы сказали кому-то: "Пойдите в магазин и купите часть своей любимой еды на ужин".
Если вы сказали это 14-летнему сыну, он, вероятно, поедет на своем велосипеде в магазин, должен будет заплатить наличными за еду, и у вас будет пицца на ужин.
Если вы сказали это своей жене, она, вероятно, поедет в магазин, воспользуется карточкой для оплаты еды, и вместо этого вы можете есть курицу Cordon Bleu с Шардоне.
В программе все работает одинаково: вы указываете что-то на относительно абстрактном уровне (идите в магазин и ужинайте). Каждый объект предоставляет свою конкретную реализацию того, как его реализовать, и во многих случаях предусматривает некоторые изменения в точности того, что он собирается делать (например, как различия в любимых продуктах выше).
Конечно, когда вы программируете, для большинства из них требуется спецификация, которая будет намного более подробной и однозначной. Однако общая идея остается прежней. В приведенном выше сценарии у вас может быть базовый класс person
(или интерфейс), в котором определены методы типа go to store
и select favorite food
и pay for purchase
. Тогда у вас будут такие реализации, как adult
и teenager
, каждый из которых определил свой собственный способ перехода в магазин, выбор любимого питания и оплату покупки. Эти методы будут полиморфными, поскольку каждая реализация будет иметь свой собственный способ выполнения команды более высокого уровня, которую вы дали.
Буквально полиморфизм означает "иметь несколько форм". В программировании, если переменная может содержать более одного типа значения, то это своего рода полиморфизм. Если функции могут обрабатывать более одного типа параметров, это также полиморфизм.
Объектно-ориентированные языки имеют полиморфизм через иерархию классов: ссылка на базовый класс или интерфейс может относиться к нескольким типам объектов, если эти другие типы получены из базы. Это называется политипом подтипа.
Общее программирование - это еще один вид полиморфизма. Применяя параметры к типам, один и тот же бит кода может обрабатывать несколько типов объектов. Это называется параметрическим полиморфизмом.
Перегрузка оператора и перегрузка методов внутри класса - это другой вид полиморфизма, известный как ad hoc-полиморфизм, поскольку он менее систематичен, чем параметрический или подтипный полиморфизм.
Полиморфизм означает возможность выбора точной вызываемой функции во время выполнения в зависимости от текущего контекста.
Это можно сделать, описав класс интерфейса, из которого будут получены другие. В его коде можно использовать только интерфейс вместо использования определенных классов. Это дает программисту возможность выбрать наилучшую реализацию для его проблем.
В качестве примера можно использовать массивы. Могут быть две возможные две реализации: одна, когда массив разрежен (много нулей) и один, когда массив заполнен. Вместо того, чтобы использовать один класс 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)
}