Не могу понять суть Полиморфизма в классах

У нас есть допустим базовый класс и класс который наследуется от базового класса. Зачем нам наследника превращать в базовый класс и отбрасывать всю его индивидульность, чтоб остались только базовые свойства. Базовый класс допустим Person p Дочерний (наследник) Doctor d

p = d; //мы сейчас дочерний класс превратили в базовый, отбросили его свойства. d = (Doctor)p //сейчас вернули ему обратно его индивидуальные свойства. Непонятно зачем такое делать.


Ответы (1 шт):

Автор решения: rotabor

Я бы определил полиморфизм в ООП как способность класса иметь собственную реализацию функциональности, определённой (декларированной) в базовом классе.

Приведу отрывок из книги Д. Албахари "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>. Но это не имеет отношения к ООП.

→ Ссылка