Отношение вложенности
Рассмотрим два класса Provider и Clent, связанных отношением вложенности. Оба класса применяются для демонстрации идей и потому устроены просто, не неся особой смысловой нагрузки. Пусть класс поставщик Provider уже построен. У класса три поля, одно из которых статическое, два конструктора, два метода - один статический и один динамический. Вот его текст: /// <summary> /// Класс поставщик,предоставляет клиентам /// статический и зкземплярный методы, /// закрываяполякласса /// </summary> class Provider { //fields string fieldP1; int fieldP2; staticintfieldPS; //Конструкторы класса /// <summary> /// Конструктор с аргументами /// </summary> /// <paramname="p1">аргумент,инициализирующий поле класса</param> /// <paramname="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); returnres; } // Статический (Модульный) метод public static string MethodPS() { string res = "Модулькласса Provider" + "\n\r"; res += string.Format("ЧисловызововметодаMethodPD = {0}", fieldPS.ToString()); returnres; }
Поля класса, как и положено, закрыты для клиентов. У класса, как и положено, есть конструктор без аргументов, инициализирующий поля класса соответствующими константами, и конструктор с аргументами, который преобразует переданные ему значения, прежде чем записать их в поля класса. Методы класса позволяют получить информацию, хранящуюся в полях. Динамический (экземплярный) метод 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); returnres; } } Обратите внимание: конструкторы клиента (класса Client) создают объект поставщика (класса Provider), вызывая конструктор поставщика. Для создания объектов поставщика могут требоваться аргументы, поэтому они передаются конструктору клиента, как это сделано в нашем примере. Создавая объект класса Client, конструкторы этого класса создают и объект класса Provider, связывая его ссылкой с полем provider. Все динамические методы клиентского класса могут использовать этот объект, вызывая доступные клиенту методы и поля класса поставщика. Метод класса Client - MethodClient1 начинает свою работу с вызова: provider.MethodPD(), вызывая сервис, поставляемый методом класса Provider. Подводя первые итоги, можно заметить, что клиент класса может создавать объекты класса поставщика, а затем, используя созданные объекты, получать доступ к сервисам, предоставляемым классом поставщика своим клиентам. Конечно, поставщик имеет закрытую часть класса, не доступную его клиентам. Как правило, для клиентов закрываются поля класса. Клиенты класса получают доступ к методам класса поставщика - совокупность этих методов определяет интерфейс класса поставщика и те сервисы, которые поставщик предоставляет своим клиентам. Напомним, что интерфейс класса составляют методы с модификатором доступа public или internal для дружественных классов.
|