
- •Лабораторная работа № 14. Иерархия классов
- •Необходимые теоретические сведения
- •Наследование
- •Наследование конструкторов
- •1) Позволяет вызвать конструктор базового класса ():
- •2) Позволяет получить доступ к члену базового класса, который скрыт "за" членом производного класса.
- •Виртуальные методы
- •Абстрактные методы и классы
- •Запрет наследования
- •Задания для самостоятельного выполнения
Наследование конструкторов
В иерархии классов и базовые, и производные классы могут иметь собственные конструкторы. При этом конструктор базового класса создает часть объекта, соответствующую базовому классу, а конструктор производного класса – часть объекта, соответствующую производному классу. Так как базовый класс не имеет доступа к элементам производного класса, то их конструкторы должны быть раздельными.
Упражнение 3. Добавить конструктор в производный класс DemoLine (см. упражнение 2).
class DemoPoint
{ protected int x;
protected int y;
public void Show()
{ Console.WriteLine("({0}, {1})", x, 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) // конструктор производного класса
{ x = x1; y = y1; xEnd = x2; yEnd = y2; }}
class Program
{ static void Main()
{ DemoPoint point = new DemoPoint(); //вызов конструктора по умолчанию
point.Show();
DemoLine line = new DemoLine(2, 2, 10, 10); // вызывается собственный конструктор
line.Show(); }}
В данном случае конструктор определяется только в производном классе, поэтому часть объекта, соответствующая базовому классу, создается автоматически с помощью конструктора по умолчанию, а часть объекта, соответствующая производному классу, создается собственным конструктором.
Если же конструкторы определены и в базовом, и в производном классе, то процесс создания объектов несколько усложняется, т.к. должны выполниться конструкторы обоих классов. В этом случае используется ключевое слово base, которое имеет два назначения:
1) Позволяет вызвать конструктор базового класса ():
конструктор_производного_класса (список_параметров) : base (список_аргументов)
// параметры конструктору базового класса передаются с помощью элемента список_аргументов
{ // тело конструктора }
Упражнение 4. Вызов конструктора базового класса.
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();}}
Упражнение 5. Вызов конструкторов классов.
С помощью ключевого слова 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(); }}
Задание. Объясните, как при вызове конструкторе производного класса инициируется вызов конструктора базового класса.