@EugeneTypescript
Учусь и работаю

Что здесь полиморфизм?

Привет, запутался с понятием "полиморфизм", всегда воспринимал его как - "способность использовать члены объекта не зависимо от его типа", т.е:

class A {
  public virtual string Name { get; init; } = "A";
}

class B : A {
  public virtual string Name {get; init;} = "B";
}

...
A a = new A();
B b = new B();

a.Name; // A
b.Name; // B
((A)b).Name; //B


То есть, несмотря на то, что тип B мы привели к базовому типу A член объекта Name все равно вызывается у B
Полиморфизм (polymorphism) – возможность одной и той же переменной в различные моменты выполнения программы обозначать объекты различных типов (классов), относящихся к одному базовому типу (классу или интерфейсу).

т.е:
Виртуальные члены класса - делают всю магию для полиморфизма?

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

Что такое полиморфизм в итоге?
Гуглил, смотрел видео, везде абстрактные классы, php какое-то, объяснение на Animal, Dog, Cat, но нет простого и емкого объяснения.
  • Вопрос задан
  • 232 просмотра
Решения вопроса 2
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
Запутаться в термине "полиморфизм" несложно. Потому что у термина много значений.
В вашем примере я бы рассуждал так:
полиморфизм = поли + морфос
поли = много
морфос = форма
то есть полиморфизм значит "много форм"

У нас есть класс А, у него есть свойство Name. Когда мы ставим ключевое слово virtual, мы говорим что для всех типов, которые есть А у свойства Name может быть много разных форм.
Когда мы наследуем B от А и переопределяем свойство Name, мы задаем еще одну форму.
У свойства Name в зависимости от типа будет определенная форма, одна из множества форм.
Это и есть полиморфизм.
Это и есть дзен)
Ответ написан
0hquazEd
@0hquazEd
1. Да, весь прикол в виртуальных методах и свойствах.
2. Полиморфизм - аспект языка, позволяющий менять поведение программы во время её исполнения или не пилить миллионы классов. Это позволяет легко наращивать функционал.

В этом примере поведение объекта исменилось за пару строк кода(с использованием smart pointers это было бы красивее).
class IDoter
{
public:

	virtual void psyche() = 0;
};

class Newbie_doter : public IDoter
{
public:

	void psyche() override
	{
		std::cout << "I've been played dota for only a week, I love the world!" << std::endl;
	}
};

class Expert_doter : public IDoter
{
public:

	void psyche() override
	{
		std::cout << "I'm a deadinside" << std::endl;
	}
};

int main(int argc, char** argv)
{
	IDoter* doter = new Newbie_doter;

	doter->psyche();
	delete doter;

	doter = new Expert_doter;
	doter->psyche();

	delete doter;
	return 0;
}

Вывод:
I've been played dota for only a week, I love the world!
I'm a deadinside


Допустим у тебя есть игра типо варфейса. Есть юнит и у него специализация(штурмовик, медик, снайпер и т.д). У тебя есть класс Map в котором есть массив всех юнитов на карте. Попробуй заполнить массив специализациями, которые НЕ наследуются от абстрактного класса. Либо ты будешь писать десятки версий класса(при каждом добавлении новой специализации ты будешь писать десятки, сотни таких вариаций), либо сделаешь абстрактный класс Unit от которого будут наследоваться специализации и при добавлении новой будет тебе останется написать пару строк кода.

Можешь так-же посмотреть здесь
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@snake2
Сразу пишу legacy код
Есть хорошая статья о ООП здесь на хабре
https://habr.com/ru/post/87205/
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы