193
Статические.классы
Более того, как видно из табл. 6.1, в CLR
есть модификатор доступа
родовой
и сборочный
. Но разработчики C# сочли этот атрибут лишним и не включили
в язык C#.
Если в производном типе переопределяется член базового типа, компилятор C#
требует, чтобы у членов базового и производного типов были одинаковые модифи-
каторы доступа. То есть если член базового класса является
защищенным
, то и член
производного
класса должен быть
защищенным
. Однако это ограничение языка C#,
а не CLR. При наследовании от базового класса CLR позволяет снижать, но не по-
вышать ограничения доступа к члену. Например,
защищенный
метод базового класса
можно переопределить в производном классе в
открытый
, но не в
закрытый
. Дело
в том, что пользователь производного класса всегда может
получить доступ к методу
базового класса путем приведения к базовому типу. Если бы среда CLR разрешала
устанавливать более жесткие ограничения на доступ к методу в производном типе,
то эти ограничения бы элементарно обходились.
статические классы
Существуют классы, не предназначенные для создания экземпляров, например
Console
,
Math
,
Environment
и
ThreadPool
. У этих классов
есть только статические
методы. В сущности, такие классы существуют лишь для группировки логиче-
ски связанных членов. Например,
класс
Math
объединяет методы, выполняющие
математические операции. В C# такие классы определяются с ключевым словом
static
. Его разрешается применять только к классам, но не к структурам (значимым
типам), поскольку CLR всегда разрешает создавать
экземпляры значимых типов,
и нет способа обойти это ограничение.
Компилятор налагает на статический класс ряд ограничений.
Класс должен быть прямым потомком
System.Object
— наследование любому
другому базовому классу лишено смысла, поскольку
наследование применимо
только к объектам, а создать экземпляр статического класса невозможно.
Класс не должен реализовывать никаких интерфейсов, поскольку методы ин-
терфейса можно вызывать только через экземпляры класса.
В классе можно определять только статические члены (поля, методы, свойства
и события). Любые экземплярные члены вызовут ошибку компиляции.
Класс нельзя использовать в качестве поля, параметра
метода или локальной
переменной, поскольку это подразумевает существование переменной, ссы-
лающейся на экземпляр, что запрещено. Обнаружив подобное обращение со
статическим классом, компилятор вернет сообщение об ошибке.
Приведем
пример статического класса, в котором определены статические члены;
сам по себе класс не представляет практического интереса.