Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекции C# for print fineprint.docx
Скачиваний:
325
Добавлен:
24.02.2016
Размер:
523.48 Кб
Скачать

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

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

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

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

publicclassX

{

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();

} }

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

Синтаксис объявления наследования

publicclassmybase

{ … }

public class derived: mybase //НАСЛЕДОВАНИЕ

{ …}

Виртуальные методы

Механизм виртуальных функций – одна из реализаций основной концепций ООП – полиморфизма. Данный механизм предполагает использование идеи «один интерфейс-множество методов реализации». Эта идея заключается в том, что базовый класс обеспечивает для производных классов все элементы, которые эти классы могут использовать непосредственно, а также содержит набор функций, которые производные классы должны реализовать путем их переопределения (создание собственного кода функции в производном классе, путем сокрытия или замещения кода базовой реализации).

Виртуальный метод– это функция, объявленная с ключевым словомvirtual в базовом классе и переопределенная в одном или нескольких производных от этого классах. Обязательное требование: заголовок функции должен быть точно такой же, как в базовом классе. Тогда при создании объекта или базового, или любого из производных классов компилятор определяет, какую из функций требуется вызвать, основываясь на типе объекта.

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

1.Если функция виртуалъная в некотором классе, то она останется виртуальной в не зависимости от уровня иерархии.

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

3.ВиртуалЬные функции должны иметь один интерфейс по всей иерархии класса.

Полиморфизм– способность объектов различных классов связанных между собой наследованием различным образом реагировать на вызов одной и той же функции.