C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Полиморфизм в Си-шарп. Что это такое?
Рассмотрев в предыдущих уроках наследование, мы теперь можем взяться за следующий принцип объектно-ориентированного программирования (ООП) – полиморфизм.

Сам термин полиморфизм можно перевести как «много форм». А если говорить проcтыми словами, полиморфизм – это различная реализация однотипных действий. Классическая фраза, которая коротко объясняет полиморфизм – «Один интерфейс, множество реализаций». Приведу примеры из жизни. В автомобилях есть рулевое колесо. Это колесо является интерфейсом между водителем и автомобилем, который позволяет поворачивать автомобиль. Механическая реализация руля у автомобилей может быть разная, но при этом результат получается одинаковым – колесо вправо – автомобиль вправо, и наоборот. Еще один пример. Клавиатура является интерфейсом ввода между пользователем и ПК. При нажатии одной и той же клавиши на различных клавиатурах результат получаем одинаковый, но при этом сама реализация нажатия клавиши может быть разная (емкостная, контактная и тд.).

Переходим к программированию

С полиморфизмом к нам прибавляются еще несколько понятий: виртуальный/абстрактный метод, переопределение метода.

Виртуальный метод – это метод, который МОЖЕТ быть переопределен в классе-наследнике. Такой метод может иметь стандартную реализацию в базовом классе.

Абстрактный метод – это метод, который ДОЛЖЕН быть реализован в классе-наследнике. При этом, абстрактный метод не может иметь своей реализации в базовом классе (тело пустое), в отличии от виртуального.

Переопределение метода – это изменение реализации метода, установленного как виртуальный (в классе наследнике метод будет работать отлично от базового класса).

В качестве системы, предоставляющей тот самый интерфейс, в программировании может выступать класс и интерфейс. Здесь мы поговорим о классах. Есть класс, в нем объявлен виртуальный или абстрактный метод. От этого класса наследуются еще несколько классов, и в каждом из них по-разному реализуется тот самый виртуальный/абстрактный метод. Получается, объекты этих классов имеют метод с одинаковым именем, но с разной реализацией. В этом и есть полиморфизм.

Например, есть класс Геометрическая Фигура, и в нем объявлен метод Draw(), который будет рисовать фигуру. От этого класса наследуются классы Треугольник, Прямоугольник, Окружность. В них реализуется метод для рисования (понятно, что реализация рисования каждой фигуры разная). В итоге мы можем создать объекты этих классов, и у всех будет метод Draw(), который будет рисовать соответствующую фигуру.

Для чего вообще нужен полиморфизм?

Полиморфизм позволяет писать более абстрактные, расширяемые программы, один и тот же код используется для объектов разных классов, улучшается читабельность кода. Полиморфизм позволяет избавить разработчика от написания, чтения и отладки множества if-else/switch-case конструкций.

Этот урок был теоретическим, в следующих мы уже детально рассмотрим полиморфизм, виртуальные/абстрактные методы на практике.

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

PS. Не забудьте поделиться с друзьями этим уроком с помощью кнопок социальных сетей.
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
27 авг 2013 00:27
Krinik 24 окт 2016 10:24
Одежда. Разные способы застёгивания.
Компьютерная мышь. Различные способы ввода информации о перемещении.

Паша 10 окт 2016 23:15
Наушники

bas-tion.ru 06 май 2016 10:54
После усвоения темы захотелось добавить комментарий по поводу полиморфизма.
Пример:
Некая полиморфическая структура выполняет работу пользуясь различными методами, в зависимости от исходных условий, но результат всегда один и тот же.
К примеру ЖЭК (полиморфическая структура). Если выпало мало снега, то дворник убирает участок лопатой. Если выпало много снега, используется другой метод - уборка участка уборочной машиной. Результат один - чистый участок.

Wehuty 04 май 2016 22:44
Автоматы для продажи вещей(еда, питье, диски сувенирка и другая фигня).
Меню в программах.

bas-tion.ru 29 апр 2016 17:01
Способ доступа к элементам массива.

a: можно узнать количество элементов массива и перебрать с помощью цикла for
b: можно использовать цикл foreach
c: можно перебрать вручную

В результате получаем значение элемента.


Andriy 28 янв 2016 12:20
Много лишнего в коде:
вот эту проверку реально лучше запихнуть в отдельную функцию и вызывать ее при перезаписи
public void check_LifeCount(int PowCoef)
{
if (this.LifeCount > 0)
{
Console.WriteLine(Name + " получил " + PowCoef + " урона, и его здоровье, " + this.LifeCount + (this.LifeCount < 10 ? " единиц, стремится к нулю!" : " единиц, держимся бодрячком!"));
}
else
{
this.LifeCount = 0;
Console.WriteLine(this.Name + " сражён на поле битвы.");
}
}

тогда сам метод overide упрощается для обслуживания до
в классе воин:
public override void TakeDamage(int PowCoef)
{
this.LifeCount-=PowCoef*2;
this.check_LifeCount(int PowCoef);
}
в классе броня:
public override void TakeDamage(int PowCoef)
{
this.LifeCount-=PowCoef*1;
this.check_LifeCount(int PowCoef);
}

Физик 18 янв 2016 11:42
Хорошие уроки! Вся информация предоставляется последовательно и шаг за шагом чувствуется прогресс:)

Например, существует класс дверь автомобиля. Суть одна и та же, она открывается и закрывается. Но реализация может быть разной, например как у классической двери, или как у модели Lamborghini с "открыванием вверх".

stani-wunderbar 11 янв 2016 12:16
добраться на работу можно на автобусе, на машине, на метро, трамвае, треллейбусе, кроме того у каждого подвида транспорта разные маршруты, короче/дленнее), но все могут привести к цели

Kolsky 30 дек 2015 19:38
UPD:Блин, не в ту тему кинул прошлое сообщение

Kolsky 30 дек 2015 19:37

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace i
{
class Warrior
{
public Warrior() { }
public Warrior(string name,uint hearts)
{
LifeCount = hearts;
Name = name;
}
public float LifeCount { get; set; }
public string Name;
public virtual void TakeDamage(int PowCoef)
{
LifeCount -= PowCoef * 2;
if (LifeCount > 0)
{
Console.WriteLine(Name + " полуцил " + PowCoef + " урона, и его здоровье, " + LifeCount + (LifeCount < 10 ? " единиц, стремится к нулю!" : " единиц, держимся бодрячком!"));
}
else if (LifeCount < 0)
{
LifeCount = 0;
Console.WriteLine(Name + " сражён на поле битвы.");
}
else Console.WriteLine(Name + " сражён на поле битвы.");
}
}
class In_LightArmor : Warrior
{
public In_LightArmor() { }
public In_LightArmor(string name,uint hearts)
{
LifeCount = hearts;
Name = name;
}
public override void TakeDamage(int PowCoef)
{
LifeCount-=PowCoef*1;
if (LifeCount > 0)
{
Console.WriteLine(Name + " полуцил " + PowCoef + " урона, и его здоровье, " + LifeCount + (LifeCount < 10 ? " единиц, стремится к нулю!" : " единиц! Держимся бодрячком!"));
}
else if (LifeCount < 0)
{
LifeCount = 0;
Console.WriteLine(Name + " сражён на поле битвы.");
}
else Console.WriteLine(Name + " сражён на поле битвы.");
}
}
class In_HeavyArmor : Warrior
{
public In_HeavyArmor() { }
public In_HeavyArmor(string name,uint hearts)
{
LifeCount = hearts;
Name = name;
}
public override void TakeDamage(int PowCoef)
{
LifeCount-=PowCoef/2+PowCoef%2;
if (LifeCount > 0)
{
Console.WriteLine(Name + " полуцил " + PowCoef + " урона, и его здоровье, " + LifeCount + (LifeCount < 10 ? " единиц, стремится к нулю!" : " единиц, держимся бодрячком!"));
}
else if (LifeCount < 0)
{
LifeCount = 0;
Console.WriteLine(Name + " сражён на поле битвы.");
}
else Console.WriteLine(Name + " сражён на поле битвы.");
}
}
class Program
{
static void Main(string[] args)
{
Warrior Soldier = new Warrior("Солдат",10);
In_LightArmor Traveller = new In_LightArmor("Traveller",12);
In_HeavyArmor Knight = new In_HeavyArmor("Рыыыцар!",16);
Soldier.TakeDamage(5);
Traveller.TakeDamage(2);
Knight.TakeDamage(23);
Console.ReadKey(true);
}
}
}


Vitaly409 13 сен 2015 14:46
Есть базовый класс Кастрюля, у него есть наследники блюда это картошка, макароны, яйца. И у всех этих классов есть одинаковый метод варить(), но реализация у них разная.

AlPer 30 июн 2015 14:40
Допустим есть базовый класс Fighter c методами Удар и СуперУдар и полями Имя бойца, Тип бойца, СуперСпособность, Сила, Ловкость и Живучесть. Пусть в игре будет 2 бойца. По условиям игры сущ-ет всего три типа бойца: Воин, Ловкач и Волшебник. При реализации данных условий у каждого из бойцов есть как общие признаки так и абсолютно не похожие др. на др. Если фантазировать дальше на эту тему можно придумать массу различных видов и подвидов бойцов. Без ПОЛИМОРФИЗМА код не реализовать. Во всяком случае будет сложно и нудно.

Flamingo 07 июн 2015 23:37
Используют много видов учебников по математике, но главная задача - знать её. Можно поставить одну задачу в плане программирования, а выполнять её на разных языках программирования. Чтобы жить мы едим, но рацион у всех разный.

Максим 19 апр 2015 14:25
Иван
---
Может и есть, но лично я подсказать ничего не могу

Иван 19 апр 2015 02:00
Да - автор красавчик, все описывает идеально, хотелось бы узнать есть ли какая нибуть книга-сборник заданий по c#. Нужно больше практики х_х
Д.з. : сигареты и пуля(принцип разный эффект 1 - смерть)
P.s. У оружия есть предохранитель ))

fgdg 10 мар 2015 10:51
C++, F#, C# => write a program.

Maryan 11 фев 2015 15:42
Модемы работают по разному, но цель одна - доступ в интернет.

Максим 05 фев 2015 14:42
Виталий
---
Нужно просто самому что-то делать, раличнее программки, практикой заниматься, и тогда ситуация будет проясняться

Виталий 05 фев 2015 11:43
Честно говоря, с пониманием теории я всегда хромаю :(. Кое-как понял, но дальше в любом случае будет понятней.

AlexWolf 28 янв 2015 13:56
Еда может быть любой, цель одна - получение энергии.

Диманиак 29 ноя 2014 00:05
Интерфейс преобразования информации в электронном виде (на электронном носителе) в информацию в бумажном виде (на бумажном носителе) = печатная техника (принтеры) - вывод информации способом матричной, струйной, лазерной и т.д технологий. В независимости от использованного класса устройств информация с полученной распечатки воспринимается человеком одинаково (эстетика восприятия не в счет).

Интерфейс газообмена кровеносной системы - дыхание через легкие у животных, через жабры у рыб, через листья у растений.

why_not 12 окт 2014 21:07
Огромное спасибо за составленный курс. Не одну книгу начинал читать, но за недостатком практики забрасывал. Отдельная благодарность - за задания после пройденного материала. Не бросайте это дело)

В качестве примера: муз. произведение и реализация на разных музыкальных инструментах.

zloy_proger 09 июл 2014 12:45
Штанга, 1 предмет с различной реализацией. Например: жим, присед, становая.

Максим 07 июл 2014 19:40
AlexSerikov
---
Рад что Вы нашли для себя что-то полезное здесь)

AlexSerikov 06 июл 2014 22:06
Огромное спасибо, уважаемый Admin! Чудесные уроки. В университете бы так преподавали...
Пример полиморфизма: реализация автоматической винтовки. "Интерфейсов" большое множество (с прикладом, подствольником, сошками, коллиматорным прицелом, глушителем, системой подачи патронов bullpup или стандарт, использование патронов разного калибра и винтовок различных модификаций). Суть одна - стрелять.

Алексей 23 июн 2014 13:02
стакан компота, если наклонить стакан, поднеся его ко рту мы попьем, в стакане может быть разный компот, а может быть и не компот, но результат один - мы попьем
p.s. главное не забыть открыть рот

Serj 22 май 2014 20:36
Как пример - кухонный комбайн. Нажатием кнопки мы запускаем моторчик. А от того какую насадку мы поставим, будет зависеть результат(нарезка ломтиками, соломкой, терка или вообще миксер).

Сергей 16 май 2014 11:15
Мусор можно веником убрать, можно пылесосом а можно ногой под ковёр. Реализация разная а результат один - мусора не видно. Хороший пример полиморфизма (если я правильно понял что такое полиморфизм).

Ромик 03 апр 2014 17:56
язык кота(моет, пьет) ДЗ ВЫПОЛНИЛ НА ОТЛИЧНО ! Самое легкое :) Я так подумал, все в нашей жизни так или иначе полиморфно:)

Ilyko 21 янв 2014 11:07
спасибо!

Максим 24 окт 2013 18:11
Elaman
---
читайте следующий урок

Elaman 24 окт 2013 10:21
spasibo,no ya nichego na ponyal)))

Максим 16 окт 2013 20:25
NikolayBelikov
---
На главной странице в списке постов вы можете найти "Конкурс". Там я давал всем участникам комплексное задание по темам до ООП. Если хотите получить это задание, напишите мне на info@mycsharp.ru

NikolayBelikov 16 окт 2013 18:00
Небольшое предложение по урокам.

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

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

Знаю разогнался, но плох, тот солдат, который не мечтает стать генералом!

Максим 14 окт 2013 23:26
Всем спасибо за добрые отзывы)

Андрей 14 окт 2013 17:24
Спасибо за статьи. Очень интересно и понятно + еще задания после каждого урока очень удобно.

в качестве примера возможно подойдет дверной звонок. Нажали получили звуковой сигнал.

Надеюсь вы продолжите развивать ресурс.

Vet 13 окт 2013 22:33
Спасибо, кратко и по

Дмитрий 09 окт 2013 14:10
Прочитал все Ваши уроки. Наглядно, понятно, доступно, одним словом, - потрясающе.
Автор, я Вам дико благодарен, буду с нетерпением ждать следующих уроков, Вы большой молодец, спасибо))

santyaga10 29 авг 2013 11:56
Двигатель у тех же машин. Реализация может быть сколько угодно разной, но эффект однотипный.


Добавить комментарий:

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter

Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus