Не могу понять суть Полиморфизма в классах
У нас есть допустим базовый класс и класс который наследуется от базового класса. Зачем нам наследника превращать в базовый класс и отбрасывать всю его индивидульность, чтоб остались только базовые свойства. Базовый класс допустим Person p Дочерний (наследник) Doctor d
p = d; //мы сейчас дочерний класс превратили в базовый, отбросили его свойства. d = (Doctor)p //сейчас вернули ему обратно его индивидуальные свойства. Непонятно зачем такое делать.
Ответы (1 шт):
Я бы определил полиморфизм в ООП как способность класса иметь собственную реализацию функциональности, определённой (декларированной) в базовом классе.
Приведу отрывок из книги Д. Албахари "C# 9.0. Справочник. Полное описание языка".
Полиморфизм
Ссылки полиморфны, т.е. переменная типа х может ссылаться на объект подкласса х. Например, рассмотрим следующий метод:
public static void Display (Asset asset) {
System.Console.WriteLine(asset.Name);
}
Метод Display способен отображать значение свойства Name объектов Stock и House, т.к. они оба являются Asset:
Stock msft
House mansion = new House ... ;
Display (msft);
Display (mansion);
В основе работы полиморфизма лежит тот факт, что подклассы (Stock и House) обладают всеми характеристиками своего базового класса (Asset). Однако обратное утверждение не будет верным. Если метод Display переписать так, чтобы он принимал House, то передавать ему Asset нельзя:
Display (new Asset()); // Ошибка на этапе компиляции
public static void Display (House house) { // Asset приниматься не будет
System.Console.WriteLine(house.Mortgage);
}
Далее уже от себя.
Вот очень показательный пример полиморфизма. Объект класса B можно присвоить переменной a типа A, потому что он, наследуя A, обладает всеми его свойствами. Но в тоже время он остаётся объектом класса B, и применив к a, которая объявлена типом A (который ничего не знает про B), метод Con, мы получаем этому подтверждение на консоли.
using System;
static class Programm {
class A {
public virtual void Con() {
Console.WriteLine("A");
}
}
class B : A {
public override void Con() {
Console.WriteLine("B");
}
}
static void Main(string[] args) {
A a = new B();
a.Con(); // B
}
}
То есть полиморфизм позволяет работать со всеми разнообразными наследниками базового класса единым образом, определённым в базовом классе, сохраняя, в тоже время, индивидуальность каждого объекта.
using System;
using System.Collections.Generic;
static class Programm {
class A {
public virtual void Con() {
Console.WriteLine("A");
}
}
class B : A {
public override void Con() {
Console.WriteLine("B");
}
}
class C : A {
public override void Con() {
Console.WriteLine("C");
}
}
class D : A {
public override void Con() {
Console.WriteLine("D");
}
}
static void Main(string[] args) {
List<A> alist = new List<A> { new B(), new C(), new B()
, new D(), new D(), new C() };
foreach (var a in alist) a.Con(); // B C B D D C
}
}
Кстати, другой тип полиморфизма в программировании - это генерализация, или использование шаблонов типов <T>. Но это не имеет отношения к ООП.