Для чего нужен полиморфизм? Можно ли обойтись без него?







+2 +/-

Вопрос связан с программированием.

Профиль пользователя Corriann Спросил: Corriann  (рейтинг 23803) Категория: компьютеры и интернет

Ответов: 2

3 +/-
Лучший ответ

Полиморфизм - это техника использования механизма позднего связывания и наследования.

Позднее связывание означает, что выбор конкретного типа переменной происходит во время работы программы, а не задается программистом явно.

Ну например, ты пишешь игру в которой есть огород и различные виды овощей - морковки, капусты и т.п. Юзер будет садить эти овощи в произвольном порядке, ты не знаешь порядок на этапе написания программы, поэтому ты не можешь написать что-то типа:

Carrot carrot_obj;

//...

carrot_obj->grow(); // просишь конкретную морковку подрасти

Есть разные способы извернуться и решить проблему в этой ситуации, но самый лаконичный из них - это полиморфизм.

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

должен описывать интерфейс для всех наших овощей:

class Fruit {

protected:

int size;

public:

virtual int grow() = 0; // метод заставляющий абстрактный овощ расти

};

Именно через этот интерфейс при использовании полиморфизма мы обращаемся к конкретным классам овощей (выбор конкретного класса выполняется автоматически {программисту не надо для этого ничего делать} в зависимости от типа объекта, который скрыт за этим интерфейсом:

class Carrot : public Fruit {

public:

int grow() { return ++size; }

}

class Potato : public Fruit {

public:

int grow() { return size += 2; }

}

При таком раскладе, наш огород должен содержать список овощей (абстрактных):

vector fruits;

при этом в С++ для использования позднего связывания надо применять указатели (или умные указатели если не хотим мучиться с утечками памяти), а в Java и С#, например, все будет сделано автоматически, т.к. там повсеместно используется идиома PIMPL (там всегда везде умные указатели).

Допустим, юзер перетащит морковку в свой огород. При этом будет создана новая морковка (каким-либо образом - я привел пример с явным вызовом конструктора, но это могло бы быть и что то типа шаблона Prototype {при этом не было бы указано что это морковка даже}) и добавлена в список овощей.

Fruit *obj = new Carrot();

fruits->push_back(obj);

Затем, в этот список могли бы добавляться в хаотичном порядке другие овощи, а какой-либо код с некоторой периодичностью выполнял рост этих овощей:

for(i = 0; i < fruits.size(); ++i) {

fruits[i]->grow();

}

При этом если i-тый объект массива фруктов был создан как морковка, то будет выполняться код Carrot::grow(), а если как картошка - то Potato::grow(). Программисту теперь не надо париться с этим, функция нужного типа будет посдавлена автоматически во время выполнения.

Ответил на вопрос: Beady  
0 +/-

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

int maxOf(int a, int b, int c)

{

..

}

float maxOf(float a, float b, float c)

{....}

double maxOf (double a, double b, double c)

{....}

и потом эти функции и дергать:

int x1, x2, x3, x4;

x4 = maxOf(x1, x2, x3);

double a1,a2,a3,a4;

a4 = maxOf(a1, a2, a3);

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

В Delphi для тех же самых случаев надо использовать ключевое слово overload:

function maxOf(a, b, c: integer):integer;overload;

begin.....end;

function maxOf(a, b, c: float):float;overload;

begin.....end;

function maxOf(a, b, c: extended):extended;overload;

begin.....end;

Ответил на вопрос: Bichord  

Похожие вопросы

Спросил
2 Отв.
Как решать подобные задачи по ИВТ(Паскаль, подготовка к ЕГЭ)(см.)?
Ответ: Данные задачи относятся к заданиям ЕГЭ по информатике, суть которых - анализ кода программы, содержащей циклы и ветвления. От решающего задачу требуется проанализировать ход выполнения программы, для ... Читать далее...
Автор вопроса: Iranian, в категории | | |
Спросил Iranian
2 Отв.
Что лучше для изучения PHP языка программирования видеокурсы или книги?
Ответ: Думаю нужно пойти третьим вариантом, найти нормальное учебное заведение в котором будут нормально обучать при помощи книг, видео материалов, лекций и заданий ... Читать далее...
Автор вопроса: Adsorption, в категории | | | |
Спросил Adsorption
1 Отв.
Как зашифровать свое имя в двоичном коде?
Ответ: Если вы любитель мозговых штурмов и у вас масса свободного времени, то можно, используя Коды символов ASCII выразить своё имя, к примеру, в десятеричном ... Читать далее...
Автор вопроса: Burnier, в категории | | |
Спросил Burnier
2 Отв.
Что такое «класс» в программировании?
Ответ: Классами программисты описывают некие абстрактные типы данных. В классе также определяются свойства, данные и методы обработки данных. Классы можно объявлять ... Читать далее...
Автор вопроса: Carita, в категории | |
Спросил Carita
1 Отв.
К какому ЯП лучше перейти после изучения верстки?
Ответ: Создание и программирование сайтов не легкая работа. Изучив весь этот процесс, нужно крапотливое приобретение стажа, изучая и вникая новые языки программирования. ... Читать далее...
Автор вопроса: Rusty, в категории | | |
Спросил Rusty
1 Отв.
Как получить оповещение о появлении на чужом сайте определенной фразы?
Ответ: Закажите у веб-программиста Парсер который будет постоянно проверять контентна сайте и проверять в нем наличие той самой ... Читать далее...
Автор вопроса: Crankpin, в категории | | | | |
Спросил Crankpin
3 Отв.
Как научиться писать компьютерные программы и зарабатывать на этом?
Ответ: Советую углубиться немного в другую отрасль - веб-программирования. Это очень выгодно и прибыльно. В среднем цена за сайт составляет от 3 до 5 тысяч рублей. ... Читать далее...
Автор вопроса: Contraction, в категории | |
Спросил Contraction
4 Отв.
Какие языки программирования нужно знать для создания качественных сайтов?
Ответ: Чтобы писать сайты с нуля, может понадобиться знание php. Как правило, такие сайты используют ту или иную СУБД, поэтому знание SQL тоже лишним не будет. ... Читать далее...
Автор вопроса: Skyed, в категории