Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Вызов конструкторов базового класса




С помощью формы расширенного объявления конструктора производного класса и ключевого слова base в производном классе может быть вызван конструктор, опре­деленный в его базовом классе. Ниже приведена общая форма этого расширенного объявления:

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

base (список_аргументов)

{

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

}

где список _ аргументов обозначает любые аргументы, необходимые конструктору в базовом классе. Обратите внимание на местоположение двоеточия.

Для того чтобы продемонстрировать применение ключевого слова base на кон­кретном примере, рассмотрим еще один вариант класса TwoDShape в приведенной ниже программе. В данном примере определяется конструктор, инициализирующий свойства Width и Height. Затем этот конструктор вызывается конструктором класса Triangle.

Листинг 11.8

// Добавить констуктор в класс TwoDShape.

 

using System;

 

// Класс для двумерных объектов.

class TwoDShape {

double width;

double height;

 

// Конструктор класса TwoDShape.

public TwoDShape(double w, double h)

{

Width = w;

Height = h;

}

 

// Свойства ширины и высоты объекта.

public double Width

{

get { return width; }

set { width = value < 0? -value: value; }

}

 

public double Height

{

get { return height; }

set { height = value < 0? -value: value; }

}

 

public void ShowDim()

{

Console.WriteLine("Ширина и высота равны " +

Width + " и " + Height);

}

}

 

// Класс для треугольника, производный от класса TwoDShape.

class Triangle: TwoDShape

{

string Style;

 

// Вызвать конструктор базового класса.

public Triangle(string s, double w, double h): base(w, h)

{

Style = s;

}

 

// Возвратить площадь треугольника.

public double Area()

{

return Width * Height / 2;

}

 

// Показать тип треугольника.

public void ShowStyle()

{

Console.WriteLine("Треугольник " + Style);

}

}

 

class Shapes4

{

static void Main()

{

Triangle t1 = new Triangle("равнобедренный", 4.0, 4.0);

Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);

 

Console.WriteLine("Сведения об объекте t1: ");

t1.ShowStyle();

t1.ShowDim();

Console.WriteLine("Площадь равна " + t1.Area());

 

Console.WriteLine();

 

Console.WriteLine("Сведения об объекте t2: ");

t2.ShowStyle();

t2.ShowDim();

Console.WriteLine("Площадь равна " + t2.Area());

}

}

Теперь конструктор класса Triangle объявляется следующим образом.

public Triangle(string s, double w, double h): base(w, h) {

В данном варианте конструктор Triangle() вызывает метод base с параметрами w и h. Это, в свою очередь, приводит к вызову конструктора TwoDShape(), инициа­лизирующего свойства Width и Height значениями параметров w и h. Они больше не инициализируются средствами самого класса Triangle, где теперь остается ини­циализировать только его собственный член Style, определяющий тип треугольника. Благодаря этому класс TwoDShape высвобождается для конструирования своего подобъекта любым избранным способом. Более того, в класс TwoDShape можно ввести функции, о которых даже не будут подозревать производные классы, что предотвра­щает нарушение существующего кода.

С помощью ключевого слова base можно вызвать конструктор любой формы, определяемой в базовом классе, причем выполняться будет лишь тот конструктор, па­раметры которого соответствуют переданным аргументам. В качестве примера ниже приведены расширенные варианты классов TwoDShape и Triangle, в которые вклю­чены как используемые по умолчанию конструкторы, так и конструкторы, принимаю­щие один аргумент.

Листинг 11.9

// Добавить дополнительные конструкторы в класс TwoDShape.

 

using System;

 

class TwoDShape

{

double width;

double height;

 

// Конструктор, вызываемый по умолчанию.

public TwoDShape()

{

Width = Height = 0.0;

}

 

// Конструктор класса TwoDShape.

public TwoDShape(double w, double h)

{

Width = w;

Height = h;

}

 

// Сконструировать объект равной ширины и высоты.

public TwoDShape(double x)

{

Width = Height = x;

}

 

// Свойства ширины и высоты объекта.

public double Width

{

get { return width; }

set { width = value < 0? -value: value; }

}

 

public double Height

{

get { return height; }

set { height = value < 0? -value: value; }

}

 

public void ShowDim()

{

Console.Writeline("Высота и ширина равны " +

Width + " и " + Height);

}

}

 

// Класс для треугольника, производный от класса TwoDShape.

class Triangle: TwoDShape {

string Style;

 

/* Конструктор, используемый по умолчанию.

Автоматически вызывает конструктор, доступный

По умолчанию в классе TwoDShape. */

public Triangle()

{

Style = "null";

}

 

// Конструктор, принимающий три аргумента.

public Triangle(string s, double w, double h): base(w, h)

{

Style = s;

}

 

// Сконстуировать равнобедренный треугольник.

public Triangle(double x): base(x)

{

Style = "равнобедренный";

}

 

// Возвратить площадь треугольника.

public double Area()

{

return Width * Height / 2;

}

 

// Показать тип треуголника.

public void ShowStyle() {

Console.WriteLine("Треугольник " + Style);

}

}

 

class Shapes5

{

static void Main()

{

Triangle t1 = new Triangle();

Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);

Triangle t3 = new Triangle(4.0);

 

t1 = t2;

 

Console.WriteLine("Сведения об объекте t1: ");

t1.ShowStyle();

t1.ShowDim();

Console.WriteLine("Площадь равна " + t1.Area());

 

Console.WriteLine();

 

Console.WriteLine("Сведения об объекте t2: ");

t2.ShowStyle();

t2.ShowDim();

Console.WriteLine("Площадь равна " + t2.Area());

 

Console.WriteLine();

 

Console.WriteLine("Сведения об объекте t3: ");

t3.ShowStyle();

t3.ShowDim();

Console.WriteLine("Площадь равна " + t3.Area());

 

Console.WriteLine();

}

}

Вот к какому результату приводит выполнение этого кода.

Сведения об объекте tl:

Треугольник прямоугольный

Ширина и высота равны 8 и 12

Площадь равна 48

 

Сведения об объекте t2:

Треугольник прямоугольный

Ширина и высота равны 8 и 12

Площадь равна 48

Сведения об объекте t3:

Треугольник равнобедренный

Ширина и высота равны 4 и 4

Площадь равна 8

А теперь рассмотрим вкратце основные принципы действия ключевого слова base. Когда в производном классе указывается ключевое слово base, вызывается конструктор из его непосредственного базового класса. Следовательно, ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызываю­щим классом. Это справедливо даже для многоуровневой иерархии классов. Аргумен­ты передаются базовому конструктору в качестве аргументов метода base(). Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...