Хелпикс

Главная

Контакты

Случайная статья





Ключевое слово base. Конструкторы в производных классах



Ключевое слово base

 

Теперь добавим в наши классы конструкторы:

 

class Person {

public string FirstName { get; set; }

public string LastName {get; set; }

 

public Person(string fName, string lName) {

   FirstName = fName;

   LastName = lName;

}

   

public void Display() {

   Console.WriteLine(FirstName + " " + LastName);

}

}

 

class Employee : Person {

public string Company { get; set; }

 

public Employee(string fName, string lName, string comp) : base(fName, lName) {

   Company = comp;

}

}

 

Класс Person имеет стандартный конструктор, который устанавливает два свойства. Поскольку класс Employee наследует и устанавливает те же свойства, что и класс Person, то логично было бы не писать по сто раз код установки, а как-то вызвать соответствующий код класса Person. К тому же свойств, которые надо установить, и параметров может быть гораздо больше.

С помощью ключевого слова base мы можем обратиться к базовому классу. В нашем случае в конструкторе класса Employee нам надо установить имя, фамилию и компанию. Но имя и фамилию мы передаем на установку в конструктор базового класса, то есть в конструктор класса Person, с помощью выражения base(fName, lName).


 

static void Main(string[] args) {

Person p = new Person("Bill", "Gates");

p.Display();

Employee emp = new Employee ("Tom", "Simpson", "Microsoft");

emp.Display();

Console.Read();

}

 

Конструкторы в производных классах

 

Конструкторы не передаются производному классу при наследовании. И если в базовом классе не опредлен конструктор по умолчанию без параметров, а только конструкторы с параметрами (как в случае с базовым классом Person), то в производном классе мы обязательно должны вызвать один из этих конструкторов через ключевое слово base. Например, из класса Employee уберем определение конструктора:

 

class Employee : Person {

public string Company { get; set; }

}

 

В данном случае мы получим ошибку, так как класс Employee не соответствует классу Person, а именно не вызывает конструктор базового класса. Даже если бы мы добавили какой-нибудь конструктор, который бы устанавливал все те же свойства, то мы все равно бы получили ошибку:

 

public Employee(string fName, string lName, string comp) {

FirstName = fName;

LastName = lName;

Company = comp;

}

 

То есть в классе Employee через ключевое слово base надо явным образом вызвать конструктор класса Person:

 

public Employee(string fName,string lName,string comp) : base(fName, lName) {

Company = comp;

}

 


 

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

 

class Person {

// остальной код класса

// конструктор по умолчанию

public Person() {

   FirstName = "Tom";

   LastName = "Johns";

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

}

}

class Person {

// остальной код класса

// конструктор по умолчанию

public Person() {

   FirstName = "Tom";

   LastName = "Johns";

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

}

}

 

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

 

public Employee(string comp) {

Company = comp;

}

 

Фактически был бы эквивалентен следующему конструктору:

 

public Employee(string comp) : base() {

Company = comp;

}

 

Задание

 

Реализовать иерархию классов: Point (точка) — MassivePoint (точка с массой) — MassiveBall (шар с массой). Точка определяется координатами в пространстве, шар имеет дополнительную характеристику — радиус.

Все параметры должны задаваться при создании объектов.

Написать функции:

• Distance (расстояние), определяющую расстояние между произвольными объектами;

• Attraction (притяжение), находящую силу взаимного притяжения между объектами, имеющими массу.

При вычислениях пренебречь возможными взаимными пересечениями объектов.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.