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

Ватсон Карли

Шрифт:

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
. Новый код выглядит следующим образом:

public MainForm {

 InitializeComponent;

 Employee Britney = new Employee("Britney Spears", 20000.00M);

 Employee Elton = new Manager("Elton John", 50000.00M);

 Manager Ginger = new Manager("Geri Halliwell", 50000.00M, 20000.00M);

 Employee[] Employees = new Employee[3];

 Employees[0] = Britney;

 Employees[1] = Elton;

 Employees[2] = Ginger;

 for (int I = 0; I < 3; I++) {

this.listBox1.Items.Add(Employees[I].Name);

this.listBox1.Items.Add(Employees[I].ToString);

this.listBox1.Items.Add("");

 }

}

Мы вызываем свойство

Name
и метод
ToString
каждого элемента массива. Выполнение кода создает следующий результат.

Приведенный код показывает, что C# при работе с массивами использует квадратные скобки. Это означает, что в отличие от VB, не существует опасности какой-либо путаницы между массивом и вызовом метода или функции. Синтаксис для объявления массива выглядит так:

Employee[] Employees = new Employee[3];

Мы видим, что массив переменных некоторого тип объявляют, помещая квадратные скобки после имени типа. Массив в C# всегда считается ссылочным объектом (даже если его элементы являются простыми типами, как

int
или
double
), поэтому на самом деле существует два этапа: объявление ссылки и создание экземпляра массива. Чтобы сделать это понятнее, разделим приведенную выше строку кода следующим образом:

Employee[] Employees;

Employees = new Employee[3];

He существует разницы между тем, что делается здесь и созданием экземпляров объектов, за исключением того, что используются квадратные скобки для указания, что это массив. Отметим также, что размер массива определяется, когда создается экземпляр объекта, сама ссылка не содержит данных о размере массива — только его размерность. Размерность определяется любым количеством запятых в объявлении массива, поэтому, например, если надо объявить двухмерный, 3×4 массив чисел типа

double
, можно написать:

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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