Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Абстрактный базовый класс






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

Если абстрактный класс является предком в иерархии наследования то он называется абстрактным базовым.

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

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

Class X{

Int a;

Void f();

Virtual void ab()=0; // это значит, что тела у функции не будет

}

 

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

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

Пример

Class twodimensionobject {

Virtual void draw()=0;

Virtual void move(int, int)=0;

Virtual void select()=0;

Virtual void scale(float)=0;

Virtual void rotate(float)=0;

}

 

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

 

Class circle: public twodimensionobject {

}

 

Особенности наследования и полиморфизма в С#

Class car {

Public readonly int maxspeed;

Private int curespeed;

Public car(int max){

Maxspeed=max;

}

Public car(){maxspeed=55; }

Public int speed {

Get{return curespeed; }

Set{curespeed=value;

If(curespeed> maxspeed){curespeed=maxspeed; }

}}

 

В данном примере построен базовый класс Car с двумя конструкторами.

Maxspeed - readonly

Curespeed – private – получен доступ с помощью свойства Speed

 

Car mycar= new car(80);

Mycar.speed = 50;

Console.writeline(“Текущая скорость машины {0} km/h”, mycar.speed);

 

При объявлении наследника формат такой же как в С++

Class MiniVan: Car{} //наследник класса Car

Main(){

Minivan myVan= new Minivan();

myVan.speed=10;

console.writeline(“MyVan едет со скоростью {0}”, myvan.speed);

}

 

Данный код показывает, что несмотря на то, что в классе MiniVan мы ничего не добавили – он имеет прямой доступ к открытому свойству Speed и использует его код повторно. При наследовании приватные члены данные не могут быть доступны через ссылку.

Язык C# не поддерживает множественное наследование – предок всегда один.

…код

Такой код компилироваться не будет. Класс-предок всегда один. Однако аналог множественного наследования для некоторого класса - реализация дискретного интерфейса.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.