Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 132
- Предыдущая
- 132/642
- Следующая
На заметку! Несмотря на то что конструкторы обычно определяются как открытые, производный класс никогда не наследует конструкторы родительского класса. Конструкторы используются для создания только экземпляра класса, внутри которого они определены, но к ним можно обращаться в производном классе через построение цепочки вызовов конструкторов, как будет показано далее.
Учитывая отношение между этими двумя типами классов, вот как можно работать с классом
MiniVan
Console.WriteLine("***** Basic Inheritance *****\n");
...
// Создать объект MiniVan.
MiniVan myVan = new MiniVan {Speed = 10};
Console.WriteLine("My van is going {0} MPH", myVan.Speed);
Console.ReadLine();
Обратите внимание, что хотя в класс
MiniVan
Speed
MiniVan
Car
Speed
Всегда помните о том, что наследование предохраняет инкапсуляцию, а потому следующий код вызовет ошибку на этапе компиляции, т.к. закрытые члены не могут быть доступны через объектную ссылку:
Console.WriteLine("***** Basic Inheritance *****\n");
...
// Создать объект MiniVan.
MiniVan myVan = new MiniVan();
myVan.Speed = 10;
Console.WriteLine("My van is going {0} MPH",
myVan.Speed);
<b>// Ошибка! Доступ к закрытым членам невозможен!</b>
myVan._currSpeed = 55;
Console.ReadLine();
В качестве связанного примечания: даже когда класс
MiniVan
Car
MiniVan
// Класс MiniVan является производным от Car.
class MiniVan : Car
{
public void TestMethod()
{
// Нормально! Доступ к открытым членам родительского
// типа в производном типе возможен.
Speed = 10;
// Ошибка! Нельзя обращаться к закрытым членам
// родительского типа из производного типа!
_currSpeed = 10;
}
}
Замечание относительно множества базовых классов
Говоря о базовых классах, важно иметь в виду, что язык C# требует, чтобы отдельно взятый класс имел в точности один непосредственный базовый класс. Создать тип класса, который был бы производным напрямую от двух и более базовых классов, невозможно (такой прием, поддерживаемый в неуправляемом языке C++, известен как множественное наследование). Попытка создать класс, для которого указаны два непосредственных родительских класса, как продемонстрировано в следующем коде, приведет к ошибке на этапе компиляции:
// Недопустимо! Множественное наследование
// классов в языке C# не разрешено!
class WontWork
: BaseClassOne, BaseClassTwo
{}
В главе 8 вы увидите, что платформа .NET Core позволяет классу или структуре реализовывать любое количество дискретных интерфейсов. Таким способом тип C# может поддерживать несколько линий поведения, одновременно избегая сложностей, которые связаны с множественным наследованием. Применяя этот подход, можно строить развитые иерархии интерфейсов, которые моделируют сложные линии поведения (см. главу 8).
Использование ключевого слова sealed
Язык C# предлагает еще одно ключевое слово,
sealed
sealed
MiniVan
// Класс Minivan не может быть расширен!
sealed class MiniVan : Car
{
}
Если вы или ваш коллега попытаетесь унаследовать от запечатанного класса
MiniVan
// Ошибка! Нельзя расширять класс, помеченный ключевым словом sealed!
class DeluxeMiniVan
: MiniVan
{
}
Запечатывание класса чаще всего имеет наибольший смысл при проектировании обслуживающего класса. Скажем, в пространстве имен
System
String
MiniVan
System.String
// Еще одна ошибка! Нельзя расширять класс, помеченный как sealed!
- Предыдущая
- 132/642
- Следующая