Наследование в C#

Большинство разработчиков считают наследование краеугольным камнем объектно-ориентированного программирования. Хотя наследование выглядит вполне простой концепцией для тех, кто впервые сталкивается с ним, утверждение о том, что наследование является краеугольным камнем, можно оспорить. Некоторые склонны считать инкапсуляцию более строгой характеристикой объектно-ориентированного программирования.

Наследование — это важная концепция и полезный инструмент. Однако, как и множество других мощных инструментов, в случае неправильного применения оно может представлять опасность. В настоящем разделе преследуется одна цель: представить наследование таким образом, чтобы можно было оценить его мощь, и при этом избежать злоупотребления им.

Синтаксис определения класса уже был показан ранее. Базовый класс указывается после двоеточия, следующего за именем класса. В С# класс имеет только один базовый класс (некоторые языки, например, С++, поддерживают множественное наследование).

Доступность членов

Доступность членов является важным аспектом наследования, особенно, когда речь идет о доступности членов базового класса из производного класса. Любые общедоступные члены базового класса становятся общедоступными и в производном классе.

Любые члены, помеченные модификатором protected (защищенные), доступны только внутри объявляющего их класса и его наследников. Защищенные члены никогда не доступны извне определяющего их класса или его наследников. Приватные (private) члены не доступны нигде, кроме определяющего их класса.

Поэтому, несмотря на то, что производный класс наследует все члены базового класса, включая и приватные, код в производном классе не имеет доступа к приватным членам, унаследованным от базового класса.

Вдобавок защищенные внутренние (protected internal) члены также видимы всем типам, определенным внутри одной сборки, и классам-наследникам определившего их класса. Реальность состоит в том, что производный класс наследует все члены базового класса за исключением конструкторов экземпляра, статических конструкторов и деструкторов.

Как было показано, управлять доступностью всего класса в целом можно при его определении. Единственными вариантами доступа к типу класса являются internal и public. При использовании наследования действует правило, что тип базового класса должен быть доступен как минимум настолько же, как и производный класс.

Рассмотрим следующий код:

1
2
3
4
5
6
class А {
protected int х;
}
public class В : А
{
}

Этот код не скомпилируется, потому что класс А объявлен как internal и не является настолько (как минимум) доступным, как производный от него класс В. Вспомните, что в отсутствие модификатора доступа класс имеет доступ internal, поэтому класс А на самом деле является internal.

Для того чтобы этот код компилировался, понадобится либо повысить класс А до уровня доступа public, либо ограничить класс В доступом internal. К тому же обратите внимание, что для класса А допустимо быть public, а для класса В — internal.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100