Главная » C# » Добавление комнатной группировки приложения управления освещением в Visual C# (Sharp)

0

Следующий код (расположенный в классе LightingController) добавляет комнаую группировку:

public object AddRoomGrouping(string description) { RoomGrouping grouping = new RoomGrouping {

Description = description. Rooms = null

} ;

_roomGroupings.Insert(grouping); return grouping ,-

}

В процессе добавления новой комнатной группировки создается экземпляр класса RoomGrouping, присваиваются значения членам данных, после чего вызывается мод  _roomGroupings. insert О, чтобы  добавить  новую  комнатную  группировку в связанный список.

Посмотрим на способ присваивания значений членам данных,  называющийся иниализацией объекта. В предыдущих примерах, для присвоения значений по умоанию членам данных экземпляра объекта мы применяли конструктор с соответсующими параметрами. Но можно также создать объект и  определить блок  кода для присвоения значений соответствующим членам данных. В случае класса RoomGrouping значения присваиваются двум общим членам данных — Description и Rooms — таким образом:

Description = description, Rooms = null

К членам данных Description и Rooms разрешен доступ для присваивания им знений, что является важным обстоятельством, т. к. данный способ не работает со свойствами с доступом только для чтения. Чтобы иметь возможность присваивать значения членам данных, при создании экземпляра  с  помощью  ключевого  слова new опускаются круглые скобки. Вместо них применяются фигурные скобки, внуи которых перечисляются разделенные запятыми пары "ключ/значение". Ключ представляет член данных, которому необходимо присвоить значение,  а значение является данными, которые присваиваются члену данных.

Еще одним способом, заслуживающим внимания в коде для добавления комнаой группировки, является определение дескриптора данных при передаче иормации:

return grouping;

В реализации AddRoomGrouping () переменной grouping присваивается экземпляр класса RoomGrouping. В объявлении класса RoomGrouping его область видимости ограничена сборкой LibLightingSystem, в то время как LightingController имеет область видимости public. Если бы метод AddRoomGrouping() попытался возврить экземпляр класса RoomGrouping, то компилятор усмотрел бы в этом ошибку по причине несоответствия областей видимости. Полагая на время, что нам, в самом деле, нужно возвратить экземпляр класса RoomGrouping, единственным  способом сделать это было бы объявление данного класса как public. Но такое изменение области видимости при объявлении класса RoomGrouping будет неправильным рением, т. к., за исключением методов базового класса, данный класс не содержит объявленных методов и  имеет общие члены данных. Этот класс имеет конкретное назначение, и его не следует разделять.

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

Решением будет объявить метод, возвращающий объект типа. При использовании объекта, мы определяем метод для возвращения экземпляра объекта.  Тип данного экземпляра может быть известен или нет, и в случае с методом AddRoomGrouping () тип неизвестен. Но в этом нет ничего страшного, т. к. мы как пользователь будет раматривать данный экземпляр как ключ, управляемый классом LightingController. На техническом жаргоне, данный объект является дескриптором, который мы педаем какому-либо другому компоненту, который знает, что с ним делать. В даом примере, дескриптор передается классу LightingController, т. к. он знает, что дескриптор является экземпляром класса RoomGrouping.

ПРИМЕЧАНИЕ

Дескрипторы были очень популярны в языке С и являются указателями на область памяти. Вызывающий код не знает, куда указывает указатель, но использует его при работе с интерфейсом API. В настоящее время применение дескрипторов пошло на убыль, т. к. вместо них  применяются  объекты,  обобщения  .NET  и  другие  конструии программирования.  Но, тем не менее, иногда дескрипторы бывают очень пезными. С их помощью можно избежать открытия внутреннего состояния вашего интерфейса API, не создавая при этом иерархии объектов для отслеживания обрений  к объектам.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии