C# для профессионалов. Том II
Шрифт:
Если необходимо, чтобы производные, но не связанные классы могли видеть поле, C# предоставит альтернативный уровень защиты
Если член класса объявлен как защищенный, то он виден только в этом классе и в производных классах. Однако обычно строго рекомендуется сохранять все поля закрытыми (
Конструкторы класса Manager
Давайте добавим по крайней мере один конструктор для класса
□ Существует дополнительный элемент информации — бонус менеджера, который необходимо определить, когда создается экземпляр объекта
□ В отличие от методов, свойств и полей, конструкторы не наследуются производными классами.
Фактически было добавлено два конструктора. Это связано с решением, что бонус менеджера обычно по умолчанию равен $100000, если он не определен явно. В VB можно определить в методах параметры по умолчанию, но C# не разрешает делать это напрямую. Вместо этого C# предлагает более мощную технику — перезагрузку методов, которая дает тот же результат. Определение в данном случае двух конструкторов позволяет проиллюстрировать эту технику.
Первый конструктор Manager имеет три параметра:
Прежде всего отметим вызов конструктора базового класса с помощью немного странного синтаксиса. Этот синтаксис называют инициализатором конструктора (constructor initializer.) При этом любому конструктору разрешается вызвать один другой конструктор перед своим выполнением. Этот вызов делается в инициализаторе конструктора с помощью показанного выше синтаксиса. Конструктор может вызвать либо другой конструктор того же класса, либо конструктор базового класса, что сделано с целью обеспечения хорошо спроектированной архитектуры конструкторов. Связанные с этим вопросы обсуждаются в главе 5. Синтаксис инициализатора конструктора требует двоеточия, за которым следует одно из ключевых слов
Показанный выше конструктор получает три параметра. Однако два из них —
В данном случае задается значение для параметра
Причина в том, что это приводит к некоторому потенциальному дублированию кода: два конструктора каждый по отдельности инициализируют поле
Перезагрузка методов
Тот факт, что для класса Manager было предоставлено два конструктора, иллюстрирует принцип перезагрузки методов в C#, в соответствии с которым предполагается, что класс имеет более одного метода с одним именем, но эти методы имеют различное число параметров. Мы продемонстрировали перезагрузку конструкторов, но точно такие же принципы применимы ко всем методам.
Не путайте термины перезагрузка и переопределение методов. Это различные и никак не связанные концепции.
Когда компилятор встречает вызов перезагруженного метода, он проверяет передаваемые параметры, чтобы определить, какой метод необходимо вызвать. В случае создания объекта менеджера, так как один конструктор получает три параметра, а другой только два, то компилятор прежде всего проверит число параметров. Следовательно, если написать:
компилятор будет использовать для создания экземпляра объекта
компилятор использует конструктор с тремя параметрами, поэтому bonus получит указанное значение 50000.00М. При наличии нескольких доступных перезагружаемых версий компилятор не сможет найти подходящую и проинициирует ошибку компиляции. Например, если написать.
то будет получена ошибка компиляции, так как оба доступных конструктора
Наконец, отметим, что C# не разрешает методам использовать параметры по умолчанию, как это делает VB. Однако легко получить тот же самый эффект с помощью перезагрузки методов, как это сделано в нашем примере. Обычный способ состоит просто в использовании перезагруженных версий, которые имеют меньше параметров, чтобы подставить значения по умолчанию для оставшихся параметров и затем вызывать другие перезагружаемые версии.
Использование классов Employee и Manager