- •Лекция 15. Наследование. Виртуальные функции. Сокрытие методов базового класса. Абстрактные и закрытые классы Наследование
- •Особенности поведения конструкторов при наследовании
- •Пример программы иерархии наследования с использованием конструкторов
- •Синтаксис объявления наследования
- •Виртуальные методы
- •Правила использования виртуальных методов
- •Сокрытие методов базового класса
- •Вызов переопределенных или скрытых методов базового класса
- •Абстрактные классы и функции
- •Правила работы с абстрактными классами и методами:
- •Пример использования абстрактного класса
- •Закрытые (изолированные) классы и методы
Вызов переопределенных или скрытых методов базового класса
Независимо от того, переопределяется некоторый член или скрывается, по-прежнему остается возможность доступа к члену базового класса внутри данного класса. Существует множество различных ситуаций, когда это оказывается полезным, например:
• Если требуется скрыть наследуемый общий член от пользователей производного класса, но необходимо иметь доступ к его функциональным возможностям внутри класса.
• Если требуется что-либо добавить к реализации наследуемого виртуального члена, а не просто заменить ее на новую переопределенную реализацию.
Для этого необходимо воспользоваться ключевым словом 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();
}
}