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

Вызов переопределенных или скрытых методов базового класса

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

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

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

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

Например:

publicclassmybase

{

publicvirtualvoidf() { // Базовая реализация}

}

public class derived: mybase

{

public override void f()

{ // Реализация в производном классе, расширяющая реализацию в базовом классе base.f();

//Дополнительная реализация в производном классе

}

В представленном коде выполняется версия метода f(), содержащаяся в классеmybase (базовом), из которой вызывается версияf(), содержащаяся внутри классаderived. Поскольку ключевое словоbase работает с экземплярами объектов, то будет ошибкой использовать его внутристатического члена.

Абстрактные классы и функции

Абстрактными в языке С# могут быть как классы так и функции. Это классы и функции, описанные с ключевым словом abstract.

Часто в базовом классе виртуальные функции фиктивны и имеют пустое тело. Эти функции существуют как некоторая абстракция, конкретное значение им придаётся в производных классах. Абстрактная функция используется для того, чтобы отложить решение о реализации функции. Для абстрактного класса нельзя создавать объекты. Главное назначение абстрактных классов – в определении интерфейса для некоторой иерархии классов.

Абстрактный класс используется только в качестве базового класса для других классов.

Цель определения абстрактного класса - предусмотрение обобщенного базового класса, на основе которого строится иерархия наследования.

Абстрактный класс не может быть использован как тип аргумента и как тип возвращаемого значения функции.

Правила работы с абстрактными классами и методами:

1. Нельзя создать экземпляры абстрактных классов.

2. Абстрактные функции не имеют реализации и должны быть переопределены в любом неабстрактном классе-наследнике.

3. Абстрактные функции автоматически являются виртуальными, но писать слово virtualнельзя.

4. Если класс содержит любую абстрактную функцию, он является абстрактным

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

abstract class mybase //абстрактный класс

{

public abstract void f(); //абстрактный метод

}

Пример использования абстрактного класса

public abstract class X//абстрактный класс

{

public int x1;

publicabstractvoidf();//абстрактный метод –не имеет реализации!

}

publicclassY:X//производный класс от абстрактного

{

//слово override– обязательно, так как идет замещение базовой реализации, //которой вообще нет!

publicoverridevoidf(){x1=3;Console.WriteLine(x1);}//обязательно методf() должен //быть переопределен в не абстрактном классе

}

class Class

{

static void Main(string[] args)

{

X a=new X();// ОШИБКА!

Y a= new Y();

a.f();

}

}