Вызов конструктора базового класса в Си-шарп

Лабораторная работа №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("Барбос");

}