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

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

1)позволяет вызвать конструктор базового класса

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

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

{ тело конструктора }

где с помощью элемента списка аргументов передаются параметры конструктору базового класса.

Пример:

class DemoPoint

{

protected int x;

protected int y;

public void Show()

{

Console.WriteLine("({0}, {1})",x, y);

}

public DemoPoint (int x, int y)//конструктор базового класса

{

this.x=x; this.y=y;

}

}

class DemoLine : DemoPoint

{

public int xEnd;

public int yEnd;

new public void Show()

{

Console.WriteLine("({0}, {1})-({2}, {3})", x, y, xEnd, yEnd);

}

public DemoLine(int x1, int y1, int x2, int y2):base(x1, y1) //конструктор производного класса

{

xEnd = x2; yEnd = y2;

}

}

class Program

{

static void Main()

{

DemoPoint point= new DemoPoint(5, 5);

point.Show();

DemoLine line = new DemoLine( 2, 2, 10, 10);

line.Show();

}

}

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

class DemoPoint

{

protected int x;

protected int y;

public void Show()

{

Console.WriteLine("({0}, {1})",x, y);

}

public DemoPoint () //конструктор базового класса по умолчанию

{

this.x=1; this.y=1;

}

public DemoPoint (int x, int y) //конструктор базового класса с параметрами

{

this.x=x; this.y=y;

}

}

class DemoLine : DemoPoint

{

public int xEnd;

public int yEnd;

new public void Show()

{

Console.WriteLine("({0}, {1})-({2}, {3})", x, y, xEnd, yEnd);

}

public DemoLine() //конструктор производного класса по умолчанию

{

xEnd = 100; yEnd = 100;

}

public DemoLine(int x2, int y2) //конструктор производного класса с двумя параметрами

{

xEnd = x2; yEnd = y2;

}

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

public DemoLine(int x1, int y1, int x2, int y2):base(x1, y1)

{

xEnd = x2; yEnd = y2;

}

}

class Program

{

static void Main()

{

DemoPoint point1= new DemoPoint(); //вызов конструктора по умолчанию

DemoPoint point2= new DemoPoint(5, 5); //вызов конструктора с параметрами

point1.Show();

point2.Show();

DemoLine line1 = new DemoLine();//вызов конструктора по умолчанию

DemoLine line2 = new DemoLine(4, 4); //вызов конструктора с двумя параметрами

//вызов конструктора с четырьмя параметрами

DemoLine line3 = new DemoLine(2, 2, 10, 10);

line1.Show();

line2.Show();

line3.Show();

}

}


2) позволяет получить доступ к члену базового класса, который скрыт "за" членом производного класса

В этом случае ключевое слово base действует подобно ссылке this, за исключением того, что ссылка base всегда указывает на базовый класс для производного класса, в котором она используется. В этом случае формат ее записи выглядит следующим образом:

Base.член_класса

Здесь в качестве элемента член_класса можно указывать либо метод, либо поле экземпляра. Эта форма ссылки base наиболее применима в тех случаях, когда имя члена в производном классе скрывает член с таким же именем в базовом классе.

class DemoPoint

{

protected int x;

protected int y;

public void Show() { Console.Write("({0}, {1})",x, y); }

public DemoPoint (int x, int y)//конструктор базового класса

{ this.x=x; this.y=y; }

}

class DemoLine : DemoPoint

{

public int xEnd;

public int yEnd;

new public void Show()

{

base.Show(); //вызов члена базового класса

Console.WriteLine("-({0}, {1})", xEnd, yEnd);

}

public DemoLine(int x1, int y1, int x2, int y2):base(x1, y1) //конструктор производного класса

{

xEnd = x2; yEnd = y2;

}

}

class Program

{

static void Main()

{

DemoLine line = new DemoLine( 2, 2, 10, 10);

line.Show();

}

}

Несмотря на то, что метод Show в классе DemoLine скрывает одноименный метод в классе DemoPoint, ссылка base позволяет получить доступ к методу Show в базовом классе. Аналогично с помощью ссылки base можно получить доступ к одноименным полям базового класса.

Контрольные вопросы:

1.Что такое конструктор класса-потомка?

2.Какие назначения ключевого слова base вы знаете? Опишите их.


Тема 7. Многоуровневое наследование. Конфликт имен и потоков классов








Дата добавления: 2015-10-26; просмотров: 1087;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.012 сек.