Правильно ли понимаю полиморфизм?

Читаю про полиморфизм. Правильно ли я понимаю, что полиморфизм, это тупо ПЕРЕОПРЕДЕЛЕНИЕ методов в классах? Есть абстрактный класс. Есть несколько, так сказать, "смежных" классов которые унаследованы от него. Переопределяя методы "смежных" классов, мы и добивается "другой реализации". (Ну естественно так, чтобы выполнялась задумка интерфейса. Напр. есть абстрактный класс "транспорт". У него методы - вперед, назад, влево, вправо. Мы не знаем какие будут объекты транспорта, скажем в 3D "коробке" мирка GTA/др.игры. У машин эти движения будут реализованы, одним способом, у лодки, самолета по другому. Другое ускорение/режимы напр. с закисью азота/без, переключение передач)
  • Вопрос задан
  • 3028 просмотров
Решения вопроса 1
AlexanderByndyu
@AlexanderByndyu
IT-архитектор, эксперт в Agile&Lean
Основаные цели при использовании полиморфизма:
  • уменьшение дублирования в коде
  • создание более "гибкого" кода


Суть в том, что за счет абстракции вы можете передавать разные объекты в одни и те же методы, при этом вам будет не важно какой конкретно объект пришел в метод.

Приведу пример. Представьте, что у вас есть автомойка - класс Автомойка - которая может работать только для желтой Лады Калина. Другие автомобили в ней не могут быть помыты. В классе есть метод ПомытьЖелтуюЛадуКалину(ЖелтаяЛадаКалина автомобиль). Т.е. есть конкретный метод, который принимает конкретный тип автомобиля.

В какой-то момент вы понимаете, что могли бы мыть и черные Волги. Вы строите еще один вход для черной Волги, т.е создаете в классе еще один метод ПомытьЧернуюВолгу(ЧернаяВолга автомобиль). Теперь ваш класс Автомойки расширил свои возможности.

Вы будете добавлять новый метод каждый раз, когда будет появляться новый тип автомобиля, который вы сможете мыть. Самое главное, что каждый из этих методов будет делать практически одно и тоже. Тут у нас 2 проблемы:
  1. дублирование в методах Помыть*
  2. зависимость нашего класса Автомойка от внешнего контекста, где появляются новые типы автомобилей. При появлении нового автомобиля нам приходится модифицировать класс Автомойки (нарушение принципа blog.byndyu.ru/2009/10/blog-post_14.html)


Какое решение? Надо выделить важные для класса Автомойка характеристика автомобиля и сделать один метод Помыть(Автомобиль автомобиль). Например, это будет высота, ширина и тип кузова автомобиля. Этого набора характеристик будет достаточно для того, чтобы помыть любой автомобиль.

Получаем:
класс Автомобиль
    свойство Высота
    свойство Ширина
    свойство ТипКузова

класс Автомойка
    метод Помыть(Автомобиль автомобиль)
        настроитьМойкуПоВысоте(автомобиль.Высота)
        настроитьМойкуПоШирине(автомобиль.Ширина)
        настроитьМойкуПоТипуКузова(автомобиль.ТипКузова)
        начатьМойку()


Теперь сколько бы разных автомобилей не добавлялось в систему наш класс Автомойка не будет меняться. Мы убрали дублирование и сделали наш класс более устойчивым к изменениям во внешней среде. У класс Автомобиль может быть наследник ЖелтаяЛадаКалина и у нее будут свойства/методы базового класса. Т.к. метод Помыть работает с абстракцией, то он будет вызывать полиморфные свойства/методы, ничего не зная о конкретной реализации и иерархии наследования, которая лежит под классом Автомобиль.

При проектировании классов надо обращать внимание еще на один принцип blog.byndyu.ru/2009/10/blog-post_29.html, тогда дизайн вашей системы будет еще более гибким.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
svd71
@svd71
Правильно (в смысле ООП). Правда изначально трактовка была немножко другой: возможность передавать в функцию различные типы данных.
Ответ написан
Комментировать
@Nubzilo
Изучаю C#
Тоже вопрос по теме, т.к. самоучка и не понимаю до конца, что такое полиморфизм и в чем смысл его использования? Под полиморфизмом я понимаю такой код, но не знаю, верно ли это...
Код на C#
void Main()
{
	List<IDriving> transports = new List<IDriving>();
	transports.Add(new Car());
	transports.Add(new Boat());
	foreach (IDriving transport in transports)
	{
		transport.MoveForward();
		transport.MoveBack();
	}
}

// Define other methods and classes here
public interface IDriving 
{
	void MoveForward();
	void MoveBack();
}

public class Car : IDriving
{
	public void MoveForward()
	{
		Console.WriteLine ("Car move forward");
	}
	public void MoveBack()
	{
		Console.WriteLine ("Car move back");
	}
}

public class Boat : IDriving
{
	public void MoveForward()
	{
		Console.WriteLine ("Boat move forward");
	}
	public void MoveBack()
	{
		Console.WriteLine ("Boat move back");
	}
}


Output:
Car move forward
Car move back
Boat move forward
Boat move back
Ответ написан
haiku
@haiku
полиморфизм, это тупо ПЕРЕОПРЕДЕЛЕНИЕ методов в классах

Нет неправильно. Полиморфизм это прежде всего "идея". Есть разные виды полиморфизма. На википедии вроде бы все достаточно элементарно описано.
ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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