Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

Manager SomeManager = new Manager("Name", 300000.00М, 50000.00М);

компилятор использует конструктор с тремя параметрами, поэтому bonus получит указанное значение 50000.00М. При наличии нескольких доступных перезагружаемых версий компилятор не сможет найти подходящую и проинициирует ошибку компиляции. Например, если написать.

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
. Данная строка кода является на самом деле сокращением записи:

  • Читать дальше
  • 1
  • ...
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: