Для любого производного класса можно указать только один базовый класс. В C# не предусмотрено наследование нескольких базовых классов в одном производном классе. (В этом отношении C# отличается от C++, где допускается наследование нескольких базовых классов. Данное обстоятельство следует принимать во внимание при переносе кода C++ в С#.) Тем не менее можно создать иерархию наследования, в которой производный класс становится базовым для другого производного класса. (Разумеется, ни один из классов не может быть базовым для самого себя как непосредственно, так и косвенно.) Но в любом случае производный класс наследует все члены своего базового класса, в том числе переменные экземпляра, методы, свойства и индексаторы.
Главное преимущество наследования заключается в следующем: как только будет создан базовый класс, в котором определены общие для множества объектов атрибуты, он может быть использован для создания любого числа более конкретных производных классов. А в каждом производном классе может быть точно выстроена своя собственная классификация. В качестве примера ниже приведен еще один класс, производный от классаTwoDShapeи инкапсулирующий прямоугольники.
// Класс для прямоугольников, производный от класса TwoDShape. class Rectangle : TwoDShape {
// Возвратить логическое значение true, если // прямоугольник является квадратом, public bool IsSquare {
if(Width == Height) return true; return false;
}
// Возвратить площадь прямоугольника, public double Area { return Width * Height;
}
}
В классRectangleвходят все члены классаTwoDShape,к которым добавлен методIs Square , определяющий, является ли прямоугольник квадратом, а также методArea , вычисляющий площадь прямоугольника.
Доступ к членам класса и наследование
Как пояснялось в главе 8, члены класса зачастую объявляются закрытыми, чтобы исключить их несанкционированное или незаконное использование. Но наследование класса не отменяет ограничения, накладываемые на доступ к закрытым членам класса. Поэтому если в производный класс и входят все члены его базового класса, в нем все равно оказываются недоступными те члены базового класса, которые являются закрытыми. Так, если сделать закрытыми переменные классаTwoDShape,они станут недоступными в классеTriangle,как показано ниже.
// Доступ к закрытым членам класса не наследуется.
// Этот пример кода не подлежит компиляции.
using System;
// Класс для двумерных объектов, class TwoDShape {
double Width; // теперь это закрытая переменная double Height; // теперь это закрытая переменная