|
|||
Ключевое слово base. Конструкторы в производных классах ⇐ ПредыдущаяСтр 2 из 2 Ключевое слово 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 (притяжение), находящую силу взаимного притяжения между объектами, имеющими массу. При вычислениях пренебречь возможными взаимными пересечениями объектов.
|
|||
|