Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры C#.doc
Скачиваний:
16
Добавлен:
22.09.2019
Размер:
472.58 Кб
Скачать

25.Конструкторы и наследование.

И базовые классы, и производные классы могут иметь собственные конструкторы. Какой же конструктор отвечает за создание объекта производного класса? Конструктор базового класса создает часть объекта соответствующую базовому классу, а конструктор производного класса создает часть объекта соотв.производному классу. Если конструктор определен только в производном классе, то просто создается объект производного класса. Если конструкторы определены и в базовом, и в производном, то должны выполнятся конструкторы обоих классов. В этом случае используют ключевое слово base, кот. имеет 2 назначения: -вызвать конструктор базового класса; -получить доступ к членам базового класса. Формат объявления: Конструктор_производного_класса(Список параметров): base (список_аргументов) {//тело конструктора} В списке аргументов задаются параметры из списка производного класса, необходимы конструктору базового класса. Ключевое слово base всегда отсылает к базовому классу, стоящему в иерархии классов непосредственно над вызывающим классом. Чтобы передать аргументы конструктору базового класса, нужно указать их в base ч-з запятую и без типа. При отсутствии слова base автоматически вызывается конструктор базового класса действительно по умолчанию. Если в иерархии классов(Figura-Rectangle-Kwadrat)конструктору базового класса требуются параметры, то все производные классы должны передавать эти параметры независимо от того, нужны ли эти параметры самому производному классу. В иерархии классов конструкторы вызыв-ся в таком порядке: сначала работает конструктор базового класса, а затем конструктор производного класса. Этот порядок не наруш-ся, если использ-ся base,т.к.: базовый класс ничего не знает о производном и он обязан инициализировать свои члены-переменные. -в производном классе тогда можно не инициализировать общие члены-переменные.

26.Ссылки на базовый класс и объекты производных классов.

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

Все перечисления в С# происходят от единого базового класса System. Enum. Конечно же, в этом базовом классе предусмотрены методы, которые могут существеннооблегчить вашу работу с перечислениями. Первый метод, о котором необходимо упомянуть, — это статический метод GetUnderlyi ngType ( ) , который позволяет получить информацию о том, какой тип данных используется для представления числовых значений элементов перечисления:// Получаем тип числовых данных перечисления (в нашем примере это будет System. yte)Console.WriteLineCEnum. GetUnderlyi ngType(typeof(EmpType)));

Кроме того, вы можете получать значимые имена элементов перечисления по их числовым значениям. Эту работу за вас выполняет статический метод Enum . Format ( ) .В нашем примере переменной типа EmpType соответствовало имя элемента перечисления Contractor (то есть эта переменная разрешалась в числовое значение 100).Для того чтобы узнать, какому элементу переменной соответствует это числовое значение, необходимо вызвать метод Enum. Format, указать тип перечисления, числовое значение (в нашем случае через переменную) и флаг форматирования (в нашем случае — G, что означает вывести как тип string, можно использовать также флаги х — шести адцатеричное значение и d — десятичное значение):// Этот код должен вывести на системную консоль строку "You are a Contractor EmpType fred:fred a EmpType. Contractor;Console. UriteLineC'You are a {0}. Enum. Format (typeof( EmpType), fred. "G"));В System . Enum предусмотрен еще один полезный статический метод — GetVal uesO. Этот метод возвращает экземпляр System. Array, при этом каждому элементу массива будет соответствовать член указанного перечисленияю