Доступ к членам базового класса — КиберПедия 

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Доступ к членам базового класса



В базовом классе поля лучше объявлять как рrivate (закрытые) для реализации принципа инкапсуляции, но тогда производные классы не получат доступа к ним.

Примечание: Закрытый член класса остается закрытым в рамках этого класса. К нему нельзя получить доступ из программного кода, определенного вне класса, включая производный класс.

Есть два способа решения проблемы доступа к закрытым членам базового класса:

1. Использовать открытые (public) свойства и методы, позволяющие получить доступ к закрытым членам класса, например, это - свойства Width и Height.

2. Использовать защищенный доступ (protected) к членам базового класса. Возможно, в базовом классе нужны какие-то вспомогательные методы, как например метод Ok(…) при разработке индексаторов. Вспомогательные методы определяются как рrivate. Но тогда этот метод не будет доступен производным классам. Чтобы метод стал доступным, лучше объявить его со словом рrotected.

Защищенным является член класса, который открыт для своей иерархии классов, но закрыт вне этой иерархии. При этом он, по сути, является закрытым, но с одним исключением. Это исключение вступает в силу, когда защищенный член класса наследуется. В этом случае защищенный член базового класса остается защищенным членом базового класса, а, следовательно, и доступным для производного класса

Защищенные члены класса будут закрыты лишь для внешнего мира, например, для функции Main().

 

Конструкторы и наследование

В иерархии классов как базовый, так и производные классы могут иметь собственные конструкторы. Какой же конструктор отвечает за создание объектов производного класса? Конструктор базового или конструктор производного, либо оба одновременно? Ответ: конструктор базового класса создает часть объекта, соответствующую базовому классу, а конструктор производного создает часть объекта, соответствующую производному классу. Ведь базовый класс «не видит» или не имеет доступа к элементам производного класса.

Если конструктор определен только в производном классе, то просто создается объект производного класса. Члены базового класса при этом будут нулевыми, если для них не были указаны действия в конструкторе.

Если конструкторы определены и в базовом, и в производном классе, то процесс создания объектов усложняется, так как должны выполняться конструкторы обеих классов. В этом случае используется ключевое слово base() в конструкторе производного класса. Это слово имеет два назначения: вызвать конструктор базового класса; получить доступ к члену базового класса, который скрыт за членом производного класса.



Формат объявления конструктора производного класса:

рublic Имя_производного_класса(список параметров): base(список аргументов для базового класса)

{

//тело конструктора

}

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

 

Задание: Разработать конструкторы с параметрами для классов Figure и Triangle.

//В классе Figure:

public Figure(double w, double h)

{

Console.WriteLine("Работа конструктора базового класса с 2-мя параметрами");

Width = w;

Height = h;

}

//В Main():

Figure Ob_Fg = new Figure(13, 8);

Ob_Fg.Show();

 

//В классе Triangle:

public Triangle (double w, double h, double c):base (w,h)

{

Console.WriteLine("Рабоатет конструктор класса Треугольник с 3-мя параметрами!");

Storona_c = c;

}

//В Main():

Triangle Tr3 = new Triangle(8, 8, 8);

Tr3.Show_Triangle();

Здесь слово (метод) base (w,h)означает вызов конструктора базового класса, который инициализирует размер фигуры size1, size2. Конструктор класса Triangle должен лишь проинициализировать лишь третью сторону с.

Применение base даёт классу Figure свободу выбора различных способов построения экземпляров классов (объектов). При этом базовый класс также может расширить свою функциональность, но об это производные классы «знать не будут».

 

Задание: Расширить классы Figure и Triangle конструкторами по умолчанию, а так же конструкторами, которые принимают один аргумент.

//В классе Figure:

public Figure()

{

Console.WriteLine("Работает конструктор базового класса без параметров");

size1 = size2 = 0;

}

public Figure(double x)

{

Console.WriteLine("Работает конструктор базового класса с 1-м параметром");

size1 = size2 = x;

}

 

//В Main():

Figure Ob_Fg2 = new Figure();

Ob_Fg2.Show();

//Выполнить!



Figure Ob_Fg3 = new Figure(15, 5);

Ob_Fg3.Show();

//Выполнить!

 

//В классе Triangle:

public Triangle()

{

Console.WriteLine("Работает конструктор класса треугольник без параметров! ");

c = 0;

}

public Triangle(double x)

: base(x)

{

Console.WriteLine("Работает конструктор класса треугольник с 1-м параметром!");

c = x;

}

 

//В Main():

Triangle Tr4 = new Triangle();

Tr4.Show_Triangle();

//Выполнить!

Triangle Tr5 = new Triangle(9.5);

if (Tr5.Is_Triangle)

Console.WriteLine("Треугольник существует, его стиль " + Tr5.Style1());

else

Console.WriteLine("Треугольник не существует");

//Выполнить!

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

Если в иерархии классов Figure à Rectangle à Kwadrat конструктору базового класса требуются параметры, то все производные классы должны передавать эти параметры независимо от того, нужно ли эти параметры самому производному классу.

 

Задание: Добавить в класс Rectangle и Kwadrat все конструкторы.

//В классе Rectangle:

public Rectangle(double w, double h)

: base(w, h)

{

Console.WriteLine("Работает конструктор класса Rectangle с двумя параметрами");

}

public Rectangle(double x)

: base(x)

{

Console.WriteLine("Работает конструктор класса Rectangle с одним параметром");

}

public Rectangle()

{

Console.WriteLine("Работает конструктор класса Rectangle без параметров");

}

//В Main():

Rectangle Rt2 = new Rectangle(3, 19);

Rt2.Show();

//Выполнить!

Rectangle Rt3 = new Rectangle(8.5);

Rt3.Show();

//Выполнить!

Rectangle Rt4 = new Rectangle();

Rt4.Show();

//Выполнить!

 

//В классе Kwadrat:

public Kwadrat()

{

Console.WriteLine("Работает конструктор класса Квадрат без параметров");

}






Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...





© cyberpedia.su 2017 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав

0.011 с.