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

 

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

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

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

Помещение радиоприемника внутрь автомобиля влечет за собой внесение в определение класса Саг следующих изменений:
// Автомобилв «имеет» (has-a) радио
public class Car {
Внутреннее радио private Radio theKusicBox;
Г
Обратите внимание, что внутренний класс Radi о был объявлен как private. С точки зрения инкапсуляции мы делаем все правильно. Однако при этом неизбежно
Хранение «семейных тайн»: ключевое слово protected 16S
возникает вопрос: а как нам иключитъ радио? : на язык программирова-
ния — а как внешний мир будет взаимодействовать с внутренним классом? Понятно, что ответственность за создание объекта внутреннего класса несет иж-шнп і контейнерный класс. В приниипе код для создания объектов внутреннего класса можно помещать куда угодно, но обычно он помещается среди конструкторов контейнерного класса:
// За сезгание объектов внутренних классов ответственны контейнерные классы
public class Саг
{
// Встроенное радио private Radio theMusicBox:
public Car{>
maxSpeed = 100; dead = false;
// Обьект внешнего класса создаст необходимые объекты внутреннего класса // при собственно» создании
theMusicBox = new RadioO; Il Если мы этого не сделаем. theMusicBox
// начнет свою жизнь с нулевой ссылки
}
public Сэг(string fame, int max. int curr) {
currSpeed = curr: maxSpeed = max; petMame = name; dead - fales; theMusicBox = newftadioO:
}
)'
Произвести инициализацию средствами С# можно и так:
// Автомобиль «ииеет» (has-a) радио
public class Car
(
Ii Встроенное радио
private Radio theMusicBox = new RadioO;
І"
Таким образом, радиоприемник внутри автомобиля у нас теперь создается: вместе с автомобилем. Однако вопрос о том, как именно можно включить этот радиоприемник, остался нерешенным. Ответ на него выглядит так: для того что ¦ бы воспользоваться возможностями внутреннего класса, необходимо демт рование (delegation). Делегирование заключается в простом добавлении во
внешний контейнерный класс методов для обращения ко внутреннему классу,
Например:
// Во внешний класс гроз влился дополнительные открытые методы и другие члены. // которые обеспечивают доступ к внутреннему классу public class Саг
166 Глава 3
С# и объектно-ориентированное программирование
public v;;rci :-злГiresЕЬоо і state)
Ii передаем (еелегиру-'г) запрос внутреннему обьекту theMusicBox.TurrtOn(state);
!
В приведенном ниже коде обратите внимание на то, что пользователь косвенно обращается к скрытому внутреннему объекту, даже не подозревая о том, что в недрах объекта Iaі существует закрытый (определенный как private) объект Radio:
IJ Выводим автомобиль на пробную поездку
public class CarApp
{
public static int Main(string[] args) {
Il Создаем автомобиль (который, в свою очередь, создаст радио)
Саг Cl:
с:1 - new CarC'SlugBug". 100. 10):
II Включаем радио (запрос будет передан внутреннему рбьекту) cl.CrankTunes(true):
// Ускоряемся
fordnt 1 - О: і < 1С: і++) cl.Speedup(20):
Выключаем радио (запрос б.уд;->і вновь передан внутреннему объекту cl.CrankTunes(false): return 0;
ї
}
Результат работы нашей программы представлен на рис.
D;\CSti jrpB d uk\L.iljs\Oh,ipU' г 3> Containment VbS...
• і..і'іі і і <•¦•j___
Си itS peed = 30 CurrSpeed = Stf CurrSveed = 73 C«i-rS(*etl = 9Я
|S lug.TJug lias overheated...
№ lu«jB*«>3 is out of order. ...
^lugBug is out of order.___
|S lugBu.j is out (if order. ...
?lugBufl is out of order....
;. suvuii'i is out of order..
Quiet tine.. .
¦ .:,: to Continue
Рис. 3.11. Как работает радио внутри автомобиля Код приложения Coniainlnn-ni можно найти в подкаталоге Chapter 3.
Определение вложенных типов 167
Определение вложенных ТИПОВ
В С# вы можете определить тип непосредственно внутри другого типа. Такие тип называются вложенными (nested):
// В С# вы можете вкладывать друг в друга классы, интерфейсы и структуры
public class MyClass

// Члены внешнего класса
public class HyHostedClasb
(
// Члены внутреннего класса
}
)
Вряд ли представленный выше синтаксис требует каких-либо объяснений. Затруднения могут возникнуть лишь с вопросом: а зачем вообще может понадобиться вкладывать определения типов друг в друга? Как правило, вложенные типы — это исключительно вспомогательные типы, используемые только теми внешними типами, в которых они непосредственно определены. Обращение к вложенным типам напрямую из внешнего мира невозможно. Реально функциональность вложенных типов практически совпадает с функциональностью внутренних типов в модели включения-делегирования, за исключением того, что для вложенных ти -пов обеспечивается более строгий контроль области видимости. В этом отношении применение вложенных типов помогает обеспечить еще более полное соответствие принципам инкапсуляции.
Для того чтобы продемонстрировать применение вложенных типов на практике, мы слегка изменим наше приложение Саг таким образом, чтобы класс Ra-ji о ста т вложенным для класса Саг. При этом мы предполагаем, что к классу Radio из внеп -
него мира напрямую обратиться будет необязательно:
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100