Симон Робинсон - C# для профессионалов. Том II
- Название:C# для профессионалов. Том II
- Автор:
- Жанр:
- Издательство:Лори
- Год:2003
- Город:Москва
- ISBN:5-85582-187-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Симон Робинсон - C# для профессионалов. Том II краткое содержание
Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.
В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.
Для кого предназначена эта книгаЭта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.
Основные темы книги• Все особенности языка C#
• C# и объектно-ориентированное программирование
• Приложения и службы Windows
• Создание web-страниц и web-служб с помощью ASP NET
• Сборки .NET
• Доступ к данным при помощи ADO NET
• Создание распределённых приложений с помощью NET Remoting
• Интеграция с COM, COM+ и службой Active Directory
C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Manager SomeManager = new Manager(100, 300000.00М, 50000.00М); // неправильно
то будет получена ошибка компиляции, так как оба доступных конструктора Manager
требуют строку, а не числовой тип в качестве первого параметра. Компилятор C# может организовать некоторый тип преобразований между различными числовыми типами, которые будут выполняться автоматически, но он не будет автоматически преобразовывать из числового значения в строку.
Наконец, отметим, что C# не разрешает методам использовать параметры по умолчанию, как это делает VB. Однако легко получить тот же самый эффект с помощью перезагрузки методов, как это сделано в нашем примере. Обычный способ состоит просто в использовании перезагруженных версий, которые имеют меньше параметров, чтобы подставить значения по умолчанию для оставшихся параметров и затем вызывать другие перезагружаемые версии.
Использование классов Employee и Manager
Теперь, когда завершено определение классов Employee
и Manager
, напишем код, который их использует. Фактически, если загрузить исходный код этого проекта с web-сайта издательства Wrox press, то можно выяснить, что два эти класса определены как часть стандартного проекта форм Windows, достаточно похожего на пример SampleRoot
. В данном случае, однако, основная форма имеет только один элемент управления — поле списка. Мы используем конструктор класса основной формы (класса с именем MainForm
) для создания экземпляров объектов Employee
и Manager
, а затем выводим данные этих объектов в поле списка. Результат представлен ниже:

Код, используемый для создания этого вывода, выглядит следующим образом:
public MainForm() {
InitializeComponent();
Employee Britney = new Employee("Britney Spearse", 20000.00M);
Employee Elton = new Manager("Elton John", 50000.00M);
Manager Ginder = new Hanager("Geri Halliwell", 50000.00M, 20000.00M);
this.listBox1.Items.Add("Elton's name is $" + Elton.Name);
this.listBox1.Items.Add("Elton's salary is $" + Elton.Salary);
this.listBox1.Items.Add("Elton's bonus is " + ((Manager)Elton).Bonus);
this.listBox1.Items.Add("Elton's monthly payment is $" + Elton.GetMonthlyPayment());
this.listBox1.Items.Add("Elton's Company is " + Employee.CompanyName);
this.listBox1.Items.Add("Elton.ToString() : " + Elton.ToString());
this.listBox1.Items.Add("Britney.ToString(): " + Britney.ToString());
this.listBox1.Items.Add("Ginger.ToString(): " + Ginger.ToString());
}
Этот код должен быть вполне понятен, так как использует элементы C#, с которыми мы уже знакомы, за исключением одной небольшой странности — один из объектов Manager
обозначен ссылкой Employee
, а не ссылкой Manager
. Мы объясним, как это работает, дальше.
Ссылки на производные классы
Подробнее рассмотрим класс Manager
, на который ссылается переменная, объявленная как ссылка на Employee
:
Employee Elton = new Manager("Elton John", 50000.00M);
Это на самом деле совершенно законный синтаксис C#. Правило вполне простое: если объявлена ссылка на некоторый тип данных В, то этой ссылке разрешается ссылаться на экземпляры В или экземпляры любого производного из В класса. Это работает, так как любой класс, производный из В, должен также реализовать все методы или свойства и т.д., которые реализует класс В. Поэтому в примере выше вызывается Elton.Name
, Elton.Salary
и Elton.GetMonthlyPayment()
. Тот факт, что Employee
реализует все эти члены, гарантирует, что любой класс, производный из Employee
, также будет это делать. Поэтому не имеет значения, указывает ли ссылка на производный класс — мы по-прежнему сможем использовать эту ссылку для вызова любого члена класса, на который определена ссылка, и будем уверены, что этот метод существует в производном классе.
С другой стороны, отметим синтаксис, который использовался при вызове свойства Bonus
на объекте Elton
: ((Manager)Elton).Bonus
. В этом случае необходимо явно преобразовать Elton
в ссылку на Manager
, так как Bonus
не реализовано в Employee
. Компилятор знает это и будет создавать ошибку компиляции, если попробовать вызвать Bonus
через ссылку на Employee
. Данная строка кода является на самом деле сокращением записи:
Manager ManagerElton = (Manager)Elton;
this.listBox1.Items.Add("Elton's bonus is " + ManagerElton.Bonus);
Как и в VB, преобразование между типами данных в C# называется преобразованием типов ( casting
). Можно заметить в приведенном выше коде, что синтаксис преобразования типов включает размещение имени типа данных в скобках перед именем переменной, преобразование которой собираются выполнить. Конечно, указанный объект должен содержать прежде всего правильный тип данных. Если в этом примере написать:
Manager ManagerBritney = (Manager)Britney;
то код будет компилироваться правильно, но при его работе будет получена ошибка, так как среда выполнения .NET определит, что Britney
является только экземпляром Employee
, а не Manager
. Ссылкам разрешается ссылаться на экземпляры производных классов, но не на экземпляры базовых классов своего собственного типа. Не разрешается ссылке на Manager
ссылаться на объект Employee
. (Это недопустимо, так как подумайте, что произойдет, если попытаться вызвать свойство Bonus с помощью такой ссылки.)
Кстати, совершенно не рассматривались подробности возникновения ошибки во время выполнения. На самом деле C# имеет для такого случая очень развитый механизм, называемый исключениями, который кратко будет показан позже.
Так как VB не поддерживает наследование реализации, то не существует прямой параллели в VB для поддержки ссылок, указывающих на объекты производных классов, как в C#. Однако это напоминает VB — можно объявить ссылку на интерфейс, при этом не имеет значения, на какой тип объекта ссылается интерфейс, пока этот объект реализует интерфейс. Если бы классы Employee
и Manager
кодировались в VB, можно было вполне сделать так, определяя интерфейс IEmployee
, который реализуют оба модуля классов, и затем обращаться к свойствам Employee
через этот интерфейс.
Массивы объектов
Важным достоинством ссылок, способных указывать на экземпляры производных классов, является то, что можно формировать массивы объектных ссылок, где различные объекты массива имеют различные типы. Это аналогично ситуации в Visual Basic, где можно сформировать массив ссылок на интерфейсы и не беспокоиться о том факте, что эти интерфейсные ссылки реализуются совершенно различными классами объектов.
Мы не видели еще, как C# работает с массивами, поэтому перепишем код классов Employee
и Manager
, чтобы сформировать массив объектных ссылок. Этот пересмотренный код можно также загрузить с web-сайта издательства Wrox Press, как пример EmployeeMaragerWithArrays
. Новый код выглядит следующим образом:
Интервал:
Закладка: