Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Отношение вложенности






Рассмотрим два класса Provider и Clent, связанных отношением вложенности. Оба класса применяются для демонстрации идей и потому устроены просто, не неся особой смысловой нагрузки. Пусть класс поставщик Provider уже построен. У класса три поля, одно из которых статическое, два конструктора, два метода - один статический и один динамический. Вот его текст:

/// < summary> /// Класс поставщик, предоставляет клиентам /// статический и зкземплярный методы, /// закрывая поля класса /// < /summary> class Provider { //fields string fieldP1; int fieldP2; static int fieldPS; //Конструкторы класса /// < summary> /// Конструктор с аргументами /// < /summary> /// < param name=" p1" > аргумент, инициализирующий поле класса< /param> /// < param name=" p2" > аргумент, инициализирующий поле класса< /param> public Provider(string p1, int p2) { fieldP1 = p1.ToUpper(); fieldP2 = p2*2; fieldPS = 0; } public Provider() { fieldP1 = " "; fieldP2 = 0; fieldPS = 0; } //Динамический (Экземплярный) метод public string MethodPD() { fieldPS++; string res = " Объект класса Provider" + " \n\r"; res += string.Format(" Мои поля: поле1 = {0}, поле2 = {1}", fieldP1, fieldP2); return res; } // Статический (Модульный) метод public static string MethodPS() { string res = " Модуль класса Provider" + " \n\r"; res += string.Format(" Число вызовов метода MethodPD = {0}", fieldPS.ToString()); return res; }

Поля класса, как и положено, закрыты для клиентов. У класса, как и положено, есть конструктор без аргументов, инициализирующий поля класса соответствующими константами, и конструктор с аргументами, который преобразует переданные ему значения, прежде чем записать их в поля класса. Методы класса позволяют получить информацию, хранящуюся в полях. Динамический (экземплярный) метод MethodPD, которому доступны поля класса, хранимые экземплярами класса, возвращает строку с информацией о хранимых значениях в полях. Одновременно этот метод увеличивает значение, хранимое в статическом поле, которое можно рассматривать как счетчик общего числа вызовов динамического метода всеми объектами данного класса. Статический метод MethodPS, которому доступно только статическое поле, возвращает в качестве результата строку с информацией о числе вызовов динамического метода.

Построим теперь класс Client - клиента класса Provider. Класс будет устроен похожим образом. Существенное дополнение состоит в том, что одним из полей является объект provider класса Provider:

/// < summary> /// Клиент класса Provider /// < /summary> class Client { //fields Provider provider; string fieldC1; int fieldC2; const string NEWLINE = " \n\r"; //Конструкторы класса public Client(string p1, int p2, string c1, int c2) { fieldC1 = c1.ToLower(); fieldC2 = c2-2; provider = new Provider(p1, p2); } public Client() { fieldC1 = " "; fieldC2 = 0; provider = new Provider(); } /// < summary> /// Метод, использующий поле класса provider /// для работы с методами класса Provider /// < /summary> /// < returns> композиция строк провайдера и клиента < /returns> public string MethodClient1() { string res = provider.MethodPD() + NEWLINE; res += " Объект класса Client" + NEWLINE; res += string.Format(" Мои поля: поле1 = {0}, поле2 = {1}", fieldC1, fieldC2); return res; }}

Обратите внимание: конструкторы клиента (класса Client) создают объект поставщика (класса Provider), вызывая конструктор поставщика. Для создания объектов поставщика могут требоваться аргументы, поэтому они передаются конструктору клиента, как это сделано в нашем примере.

Создавая объект класса Client, конструкторы этого класса создают и объект класса Provider, связывая его ссылкой с полем provider. Все динамические методы клиентского класса могут использовать этот объект, вызывая доступные клиенту методы и поля класса поставщика. Метод класса Client - MethodClient1 начинает свою работу с вызова: provider.MethodPD(), вызывая сервис, поставляемый методом класса Provider.

Подводя первые итоги, можно заметить, что клиент класса может создавать объекты класса поставщика, а затем, используя созданные объекты, получать доступ к сервисам, предоставляемым классом поставщика своим клиентам. Конечно, поставщик имеет закрытую часть класса, не доступную его клиентам. Как правило, для клиентов закрываются поля класса. Клиенты класса получают доступ к методам класса поставщика - совокупность этих методов определяет интерфейс класса поставщика и те сервисы, которые поставщик предоставляет своим клиентам. Напомним, что интерфейс класса составляют методы с модификатором доступа public или internal для дружественных классов.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.