| Россия, Братск |
Концепция наследования и ее реализация в языке 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 и объект-индексатор.
