Украина |
Концепция наследования и ее реализация в языке C#
Исследовав основные свойства отношения наследования и способы его наглядной формализации, рассмотрим, каким образом эта теоретическая концепция реализуется в языках объектно-ориентированного программирования, и, в частности, в языке C#.
В простейшем случае язык программирования C# поддерживает единичное наследование. Проиллюстрируем реализацию механизма единичного наследования фрагментом программы на языке C#.
class A { // базовый класс int a; public A() {...} public void F() {...} } class B : A { // подкласс (наследует свойства класса A, // расширяет класс A) int b; public B() {...} public void G() {...} }
Применительно к языку программирования C# наследование есть отношение между классами. Данный пример содержит описание более общего (находящегося выше по ISA-иерархии ) класса A и его подкласса - класса B. Заметим, что находящийся выше по ISA-иерархии класс принято называть базовым, а находящийся ниже - производным (или подклассом).
Подкласс B наследует свойства класса A, и, кроме того, возможно, расширяет его новыми (по сравнению с классом A ) свойствами.
Приведенный фрагмент программы на языке C# иллюстрирует простейший случай наследования, а именно, единичное наследование.
Рассмотрим подробнее, каким образом производится реализация механизма наследования.
Производный класс B наследует свойство a и метод F() базового класса A. Кроме того, к свойствам производного класса B добавляется новое по сравнению с базовым классом A свойство b, а к методам - новый по сравнению с базовым классом A метод G().
Заметим, что операторы конкретизации элементов базовых классов (которые в языке C# называют конструкторами ) не наследуются производными классами. Отметим также, что некоторые из наследуемых методов могут игнорироваться. В ходе единичного наследования производный подкласс может наследовать свойства единственного базового класса. Множественное наследование, демонстрирующее гибкость механизмов наследования в языке C#, реализуется на основе интерфейсов. Хотя производный класс в языке программирования C# может наследовать свойства базового класса, он не может наследовать свойств структуры. Реализация механизма наследования (в том числе множественного ) для структур в языке программирования C# осуществляется (как и в случае с классами) посредством интерфейсов.
В случае неявного задания базового класса производный класс наследует свойства наиболее общего класса Microsoft .NET, известного как объект ( object ) и аналогичного концепту THING ("сущность") в рассмотренном ранее примере фреймовой нотации.
Для иллюстрации множественного наследования приведем фрагмент программы на языке C#, содержащей описание интерфейса:
public interface IList : ICollection, IEnumerable { int Add (object value); // методы bool Contains (object value); bool IsReadOnly { get; } // свойство object this [int index]{ get; set; } // индексатор }
Из приведенного примера видно, что фрагмент программы на языке C# представляет собой описание общедоступного интерфейса IList, наследующего в иерархии элементы интерфейсов ICollection и IEnumerable, а также содержащего методы Add и Contains, свойство IsReadOnly и объект-индексатор.