Вызов конструктора базового класса в си-шарп
Лабораторная работа №10
Разработка программ, реализующих механизм наследования
Цель работы:
Научиться разрабатывать программы, которые реализуют механизм наследования классов с использованием среды Visual Studio.Net.
Теоретические сведения
Начнем рассмотрение наследования из жизненных ситуаций. Для примера, возьмем такие понятия, как человек и студент. У любого человека есть имя, рост, вес и другие общие характеристики. Студент же является частным случаем человека, у него также есть имя, рост, вес, но кроме этого, он учится в некотором ВУЗе, на определенной специальности и имеет средний балл. С точки зрения наследования, в этом случае, студент является наследником понятия человек. Еще один пример можно привести с животными. Животное - это общее понятие. Животных можно поделить на рыб, птиц и млекопитающих. Каждый из этих групп животных различаются некоторым характеристиками, но у всех них есть общие особенности животных.
А теперь перейдем к программированию. В программировании наследование позволяет создавать новый класс на базе другого. Класс, на базе которого создается новый класс, называется базовым, а базирующийся новый класс – наследником или производным классом. В класс-наследник из базового класса переходят поля, свойства, методы и другие члены класса.
Объявление нового класса, который будет наследовать другой класс, выглядит так:
class [имя_класса] : [имя_базового_класса]
{
// тело класса
}
Приведем простой пример использования наследования. На основе базового класса Животное создаются два класса Собака и Кошка, в эти два класса переходит свойство Имя животного:
class Animal
{
public string Name { get; set; }
}
class Dog : Animal
{
public void Guard()
{
// собака охраняет
}
}
class Cat : Animal
{
public void CatchMouse()
{
// кошка ловит мышь
}
}
class Program
{
static void Main(string[] args)
{
Dog dog1 = new Dog();
dog1.Name = "Барбос"; // называем пса
Cat cat1 = new Cat();
cat1.Name = "Барсик"; // называем кота
dog1.Guard(); // отправляем пса охранять
cat1.CatchMouse(); // отправляем кота на охоту
}
}
Вызов конструктора базового класса в Си-шарп
В базовом классе и классе-наследнике могут быть объявлены конструкторы, и тут возникает вопрос – какой конструктор за что должен отвечать, и как их вызывать. Логично будет сказать то, что конструктор базового класса будет создавать ту часть объекта, которая принадлежит базовому классу (ведь из базового класса о наследнике ничего неизвестно), а конструктор из наследника будет создавать свою часть.
Когда конструктор определен только в наследнике, то здесь всё просто – при создании объекта сначала вызывается конструктор по умолчанию базового класса, а затем конструктор наследника.
Когда конструкторы объявлены и в базовом классе, и в наследнике – нам необходимо вызывать их оба. Для вызова конструктора базового класса используется ключевое слово base. Объявление конструктора класса-наследника с вызовом базового конструктора имеет следующую структуру:
[имя_конструктора_класса-наследника] ([аргументы]) : base ([аргументы])
{
// тело конструктора
}
В базовый конструктор передаются все необходимые аргументы для создания базовой части объекта.
Приведем пример вызова базового конструктора. Есть тот же класс Животное и класс Попугай. В классе Животное есть только свойство Имя, и конструктор, который позволяет установить это имя. В классе Попугай есть свойство Длина клюва и конструктор, в котором мы задаем эту длину. При создании объекта Попугай мы указываем два аргумента – имя и клюв, и дальше аргумент Имя передается в базовый конструктор, он вызывается, и после его работы выполнение передается конструктору класса Попугай, где устанавливается длина:
class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
class Parrot : Animal
{
public double BeakLength { get; set; } // длина клюва
public Parrot(string name, double beak) : base(name)
{
BeakLength = beak;
}
}
class Dog : Animal
{
public Dog(string name) : base (name)
{
// здесь может быть логика создания объекта Собака
}
}
class Program
{
static void Main(string[] args)
{
Parrot parrot1 = new Parrot("Кеша", 4.2);
Dog dog1 = new Dog("Барбос");
}