Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 15. Наследование. Виртуальные функции.Переопределение.doc
Скачиваний:
143
Добавлен:
24.02.2016
Размер:
64.51 Кб
Скачать

Лекция 15. Наследование. Виртуальные функции. Сокрытие методов базового класса. Абстрактные и закрытые классы Наследование

Наследование – создание новых классов на базе существующих.

Наследование- способ повторного использования уже существующего кода, при котором новые классы создаются из уже существующих путем заимствования их атрибутов и функций и обогащения этими возможностями новых классов.

Наследование- это использование базового класса описывающего наиболее общие свойства объекта. Производный класс включает в себя черты базового класса, а также добавляет новые, которые характерны только для объектов этого класса.

Одна из особенностей производного класса – видимость унаследованных компонент базового класса.

Класс, который наследуется (является родителем) называется базовым классом, а класс, который является наследником (потомком) называетсяпроизводным классом.

Как базовый, так и производный класс могут иметь свои конструкторы. Так как конструктор базового класса ничего не знает о конструкторе производного класса, то при создании объекта производного класса вначале будет выполнен конструктор базового класса, а затем – конструктор производного.

Таки образом, перед активацией конструктора производного класса автоматически производится вызов конструктора базового класса- следовательно, независимо от того, какого уровня иерархии описан объект, в его составевсегда существуют объекты базового класса.

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

Особенности поведения конструкторов при наследовании

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

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

Пример программы иерархии наследования с использованием конструкторов

public class X

{

protectedintx;//ОБРАТИТЕ ВНИМАНИЕ НА РЕЖИМ ДОСТУПА!

public X(int x){this.x=x;}

}

public class Y:X

{

int y;

//вызов конструктора базового класса и реализации конструктора производного класса

public Y(int x,int y):base(x) {this.y=y;}

public void Run(){int s=x+y; Console.Write(s);}

}

class Class

{

static void Main(string[] args)

{

Ya=newY(10,20);//заметьте, базового класса явно нигде нет!!!

a.Run();

}}

В языке С# имеет место простое наследование, когда строился один класс из другого, наследуя его характеристики. Однако имеется также возможность порождать класс из нескольких базовых классов. Когда класс наследует характеристики нескольких классов, такое наследование называетсямножественным наследованием. В языке С# понятие множественного наследованиясуществует только для интерфейсов (то есть один класс может наследовать множество интерфейсов).