Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
гавно для печати.docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
171.17 Кб
Скачать

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

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

30. Виртуальные методы и их переопределение.

Виртуальным наз.метод, объявленный с помощью слова virtual в базовом классе и переопределяемый в одном или нескольких производных классах. Каждый производный класс может иметь свою собственную версию реализации виртуального метода. Именно ч-з ссылку на базовый класс будет вызываться необходимая версия виртуального метода. По типу объекта, на который указывает ссылка, и вызывается нужный метод. Причем решение принимается динамически, т.е.во время выполнения программы. При определении виртуального метода пишут: public virtual <тип возврата>Имя метода(…){ … } При переопределении вирт.метода в производном классе пишут public override <тип возврата>Имя метода(…){…} Переопределение метода наз.замещением метода. Примечания: 1.при переопределении метода сигнатуры(списки параметров) и типы возвратов у вирт.метода и метода-заменителя должны совпадать. 2.вирт. метод нельзя определять как static-метод 3.вирт.метод переопределять не обязательно. В этом случае будет выполняться версия определенная в базовом классе . 4.свойства можно разрабатывать со словом virtual, а затем с помощью слова override переопределять их в производном классе. Переопределение вирт.метода –основа для одной из самых мощных концепций С#: динамической диспетчеризации метода. – это механизм метода во время выполнения программы, а не в период компиляции. Благодаря такому механизму реализ-ся: динамический полиморфизм и наследование. Сочетая наследование с возможностью переопределения методов в базовом классе можно определить общую форму методов, кот.будет использ. Производными классами. Например, в классе Figura можно разработать вирт. методы Площадь и Периметр, и переопределять их в производных классах.