Ссылки на базовый класс и объекты производных классов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ссылки на базовый класс и объекты производных классов



 

В иерархии классов в C# допускается, чтобы у базовых и производных классов были свои собственные конструкторы. В связи с этим возникает следующий резонный вопрос: какой конструктор отвечает за построение объекта производного класса: конструктор базового класса, конструктор производного класса или же оба? На этот вопрос можно ответить так: конструктор базового класса конструирует базовую часть объекта, а конструктор производного класса — производную часть этого объекта. И в этом есть своя логика, поскольку базовому классу неизвестны и недоступны любые элементы производного класса, а значит, их конструирование должно происходить раздельно.

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

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

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

 

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

{

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

}

 

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

Давайте рассмотрим пример:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class MyClass

{

public int x, y, z;

// Конструктор базового класса

public MyClass(int x, int y, int z)

{

this.x = x;

this.y = y;

this.z = z;

}

}

 

class ClassA: MyClass

{

int point;

// Конструктор производного класса

public ClassA(int point, int x, int y, int z)

: base(x, y, z)

{

this.point = point;

}

 

public void Pointer(ClassA obj)

{

obj.x *= obj.point;

obj.y *= obj.point;

obj.z *= obj.point;

Console.WriteLine("Новые координаты объекта: {0} {1} {2}", obj.x, obj.y, obj.z);

}

}

 

class Program

{

static void Main()

{

ClassA obj = new ClassA(10, 1, 4, 3);

Console.WriteLine("Координаты объекта: {0} {1} {2}", obj.x, obj.y, obj.z);

obj.Pointer(obj);

Console.WriteLine("Для продолжения нажмите любую клавишу...");

Console.ReadKey();

}

}

}

 

Рис. 1. 1. Результат работы кода выше

 

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

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

Ссылки на базовый класс и объекты производных классов

Ссылки на базовый класс и объекты производных классов

 



Поделиться:


Последнее изменение этой страницы: 2016-12-28; просмотров: 227; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.85.9.208 (0.005 с.)