Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю (книги без регистрации бесплатно полностью TXT, FB2) 📗
На заметку! Несмотря на то что конструкторы обычно определяются как открытые, производный класс никогда не наследует конструкторы родительского класса. Конструкторы используются для создания только экземпляра класса, внутри которого они определены, но к ним можно обращаться в производном классе через построение цепочки вызовов конструкторов, как будет показано далее.
Учитывая отношение между этими двумя типами классов, вот как можно работать с классом
MiniVanConsole.WriteLine("***** Basic Inheritance *****n");...// Создать объект MiniVan.MiniVan myVan = new MiniVan {Speed = 10};Console.WriteLine("My van is going {0} MPH", myVan.Speed);Console.ReadLine();Обратите внимание, что хотя в класс
MiniVanSpeedMiniVanCarSpeedВсегда помните о том, что наследование предохраняет инкапсуляцию, а потому следующий код вызовет ошибку на этапе компиляции, т.к. закрытые члены не могут быть доступны через объектную ссылку:
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();В качестве связанного примечания: даже когда класс
MiniVanCarMiniVan// Класс 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# предлагает еще одно ключевое слово,
sealedsealedMiniVan// Класс Minivan не может быть расширен!sealed class MiniVan : Car{}Если вы или ваш коллега попытаетесь унаследовать от запечатанного класса
MiniVan// Ошибка! Нельзя расширять класс, помеченный ключевым словом sealed!class DeluxeMiniVan : MiniVan{}Запечатывание класса чаще всего имеет наибольший смысл при проектировании обслуживающего класса. Скажем, в пространстве имен
SystemStringMiniVanSystem.String// Еще одна ошибка! Нельзя расширять класс, помеченный как sealed!