KNOW INTUIT, Лекция, Йерархия на класовете
Многостепенна йерархия
Досега разгледахме прост йерархичен тип клас, който се състои от един базов клас и един производен клас. Като цяло можете да изградите йерархия на класове, състояща се от произволен брой нива на наследяване. Разгледайте следната йерархия на класовете:
Базов клас и променливи на производен клас
C# е строго типизиран език и изисква стриктна съвместимост на типове по отношение на стандартните преобразувания на типове. Което означава, че променлива от един тип обикновено не може да препраща към обект от друг референтен тип. С едно незначително изключение, референтна променлива на базов клас може да препраща към обект от произволен клас. Нека демонстрираме това с пример:
Грешка ще възникне и при опит за достъп до метода Show чрез обекта point2. Например point2.Show() . В този случай компилаторът няма да може да определи дали да извика метода Show на базовия клас или на производния клас. За да разрешите този проблем, можете да използвате такава концепция катополиморфизъм, която се основава на механизма на виртуалните методи.
Виртуални методи
По този начин, благодарение на полиморфизма, е възможно да се осъществява достъп до обекти от различни типове чрез референтна променлива, както и да се извършват различни действия, използвайки едно и също име.
Абстрактни методи и класове
Понякога е полезно да се създаде базов клас, който дефинира само един вид „празно място“, което всички производни класове ще наследят, като всеки попълва „празното“ със собствена информация. Такъв клас дефинира структурата на методите, които производните класове трябва да внедряват, но сам по себе си не предоставя реализации на тези методи. Подобна ситуацияможе да възникне, когато базовият клас просто не е в състояние да имплементира метода. В тази ситуация се разработватабстрактни методиили целиабстрактни класове.
Създава се абстрактен метод с абстрактния модификатор. Той няма тяло и следователно не е имплементиран от базовия клас, а производните класове трябва да го заменят. Абстрактен метод автоматично е виртуален, но не е необходимо да използвате виртуалния спецификатор. Освен това, ако се опитате да използвате два спецификатора едновременно, абстрактен и виртуален, компилаторът ще издаде съобщение за грешка.
Ако даден клас съдържа един или повече абстрактни класове, тогава той също трябва да бъде деклариран абстрактен чрез използване на абстрактния спецификатор преди class. Тъй като абстрактният клас не е напълно внедрен, не е възможно да се създаде екземпляр на класа с помощта на оператора new. Например, ако класът Demo е дефиниран като абстрактен, тогава опитът за създаване на екземпляр на класа Demo ще доведе до грешка:
Въпреки това е възможно да се създаде масив от връзки, като се използва същият абстрактен клас:
Ако производен клас наследява абстрактен, тогава той трябва напълно да замени всички абстрактни методи на базовия клас или също да бъде обявен за абстрактен. По този начин абстрактният спецификатор се наследява, докато всички абстрактни методи не бъдат внедрени в производния клас.
Помислете за пример за използване на абстрактни методи и класове.
Забрана за наследяване
C# има ключовата дума sealed, която ви позволява да опишете клас, от който не е разрешено наследяването. Например: