Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 77

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 71 72 73 74 75 76 < 77 > 78 79 80 81 82 83 .. 320 >> Следующая

176 Глава 3 • С# и объектно-ориентированное программирование
лен метод DrawC), несовместимый с нашей собственной реализацией метода Draw(). Лучший способ запретить пользователям объектов обращаться к реализации метода в базовом классе — как раз воспользоваться сокрытием методов, объявив в производном классе нашу собственную реализацию метода с ключевым словом new.
Код приложения Shapes можно найти в подкаталоге Chapter 3.
Приведение типов в С#
К настоящему моменту мы создали уже не одну развитую иерархию типов. При этом С# позволяет приводить (cast) один тип к другому, то есть осуществлять преобразование объектов одного типа в объекты другого типа. Рассмотрению правил приведения типов в С# и посвящен этот раздел.
Рассмотрим приведение типов на простом примере. Вспомним нашу иерархию классов сотрудников. Конечно же, на самой вершине этой иерархии стоит класс System.Object — в С# все типы производятся от этого класса. Можно сказать, используя терминологию классического наследования, что все типы являются is-a-объектами. Кроме того, в нашей иерархии существуют и другие отношения классического наследования. Например, PTSalesPerson (продавец на неполный рабочий день) является is-a-продавцом Salesperson и т. д.
Все указанные ниже операции приведения типов допустимы:
Il Класс Manager - производный от System.Object
object о - new Managert"Frank Zappa". 9. 40000. "111-11-1111". 5);
Il Класс Manager - производный от Employee
Employee e = new Manage г("MoonUnit Zappa". 2, 20000, "101-11-1321". 1); II Класс PTSalesPerson - производный от Salesperson
Salesperson sp - new PTSa 1 es Person ("J ill". 84. 100000. "111-12-1119". 90):
Первый закон приведения типов звучит так: если один класс является производным от другого, всегда безопасно ссылаться на объект производного класса через объект базового класса. В результате мы можем использовать в С# весьма мощные программные конструкции. Например, если у нас определен метод для увольнения сотрудника:
public class TheMachine I
public static void FireThisPerson(Employee e)
{
Il Удаляем сотрудника из базы данных
// Отбираем у него ключ и точилку для карандашей
}
}
В соответствии с правилами приведения типов мы можем передавать методу FireThisPersonO объект как самого типа Emplt.'ee, так и любого производного от Employee типа:
// Производим сокращение персонала TheMachine.FireThisPerson(e); TheMachine.FireThisPerson(sp):
Обработка исключений 177
Этот код будет выполнен без ошибок, поскольку здесь производится неявное приведение от базового класса (Employee) к производному. Однако что, если вы также хотите уволить объект класса Manager (который в настоящее время хранится через ссылку на объект базового класса)? Если вы попробуете передать ссылку на объект (типа System.Object) нашему методу FireThisPersonC), то вы получите сообщение об ошибке компилятора:
// Класс Manager - производный от System.Object. поэтому мы инеем право провести // следующую операцию приведения:
objecto - new Manager( "Frank Zappa", 9. 40000.. "111-11-1111". 5): TheMachlne.FireThisPersonfo): //Ошибка компилятора!
Причина ошибки кроется в определении метода Fl reThisPersonO, который принимает объект типа Employee. Чтобы этой ошибки не возникало, нам необходимо явно привести объект базового класса System. Object к производному типу Empl оуее
(учитывая происхождение нашего объекта о, это вполне возможно):
// Здесь будет ошибка - вначале нужно провести явное приведение типов: // FireThisPersonO
// A вот так проблем не возникнет: Fi reThi s Person ((Emplоуее)о);
Приведение числовых типов
Приведение числовых типов подчиняется примерно тем же правилам, что и приведение классов. Если вы пытаетесь привести «больший» числовой тип к «мент ¦ шему» (например, int - в byte), необходимо провести явное преобразование:
int X = 30000;
byte b = (byte)x: И Возможна потеря данных..
Нас можно поздравить: теперь мы уже умеем создавать сложные иерархии пользовательских типов в С#. В главах 4 и 5 будут рассмотрены дополнительные приемы проектирования классов. Но прежде чем перейти к ним, мы должны рас -смотреть еще два тесно связанных с проектированием классов: обработку
ошибок и управление памятью.
Обработка исключений
В течение множества лет обработка ошибок превращалась разработчиками, использующими Windows, в сложную смесь различных приемов. Множество программистов реализовывало свою собственную логику обработки ошибок в рамках одно-го-единственного конкретного приложения. Например, команда разработчиков могла определить свой набор констант для представления известных условий возникновения ошибок и использовать их как значения, возвращаемые методами, Помимо этого в Windows API было определено большое количество кодов ошибок, которые должны были обрабатываться при помощи #define, HRESULTS и множества прочих средств. Многие СОМ-разработчики использовали набор стандартных СОМ-интерфейсов для возвращения значимой информации об ошибках клиентам СОМ.
178 Глава 3 • С# и объектно-ориентированное программирование
Предыдущая << 1 .. 71 72 73 74 75 76 < 77 > 78 79 80 81 82 83 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100