logo
Лекции по ая

Вложенные классы

Рассмотрим пример вложенных классов. Создадим два класса, первый определяет человека (Person) второй дом (House). Класс Person является вложенным в классе House. При помощи класса Person в классе House определяется владелец дома.

class Person

{

string name;

int pasportNumber;

public Person(string NewName, int NewPasportNumber)

{

name = NewName;

pasportNumber = NewPasportNumber;

}

public void Print()

{

Console.WriteLine("Фамилия - {0}, № паспотрта - {1}", name, pasportNumber);

}

public string Name

{

get

{

return name;

}

}

}

class House

{

string street;

int houseNumber;

Person ownerHouse;

public House(string NewStreet, int NewHouseNumber, Person NewOwnerHouse)

{

street = NewStreet;

houseNumber = NewHouseNumber;

ownerHouse = NewOwnerHouse;

}

public House(string NewStreet, int NewHouseNumber, string NewName, int NewPasportNumber)

{

street = NewStreet;

houseNumber = NewHouseNumber;

ownerHouse = new Person(NewName, NewPasportNumber);

}

public void Print()

{

Console.WriteLine("Адрес ул. {0} д. {1}, владеет - {2}", street, houseNumber, ownerHouse.Name);

}

}

class Program

{

static void Main()

{

Person p1=new Person("Иванов", 1234);

House h1 = new House("Ленина", 10, p1);

h1.Print();

House h2 = new House("Ленина", 10,"Петров", 4321);

h2.Print();

Console.ReadLine();

}

}

Рассмотрим приведенный пример. В классе Person, описывающего человека определено два поля, name для хранения фамилии и pasportNumber для хранения номера паспорта. Конструктор Person используется для инициализации новых объектов, и принимает на вход два параметра. Свойство Name позволяет выполнить чтение одноименного поля. Поля класса закрыты для доступа из вне. Метод Print используется для вывода информации об объекте на консоль.

Класс House определяет дом. В нем определены три поля: street и houseNumber для хранения адреса и ownerHouse для определения владельца дома. Поле ownerHouse определено как экземпляр класса Person описанного выше, класс House выступает в качестве клиента для класса Person, т.к. при помощи класса Person в классе House определено поле. Для класса House определено два конструктора. Первый принимающий на вход три параметра, в качестве третьего параметра принимает переменную типа Person, которую необходимо создать заранее. Второй конструктор имеющий четыре входных параметра сам создает объект класса Person.

В точке вызова программы, методе Main, приводиться пример создания объекта класса House при помощи обоих конструкторов. В первом случае сначала создаться объект p1 класса Person, в затем при помощи него инициализируется объект h1 класса House. Во втором случае объект h2 класса House создаться сразу, без промежуточного создания объекта класса Person. В этом случае как было сказано выше, объект класса Person создается конструктором класса House.

Класс поставщик создает сервисы, предоставляемые своим клиентам. Клиенты создают объекты поставщика. Вызывая доступные им сервисы, клиенты получают возможность выполнить работу, которую сами они выполнить не могут. Клиенты не могут ни повлиять на поведение методов поставщика, ни изменить состав предоставляемых им сервисов, они не могут вызывать закрытые поставщиком поля и методы класса.

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