* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Реализация полиморфизма через наследование
8 февраля 2009

Наследование позволяет объявить новый класс на основе существующего, передав
новому классу все члены и функциональность существующего класса. Так удается
создавать классы, реализующие базовый набор возможностей, а затем использовать
их для объявления производных классов для исполнения различных, но связанных
функций. На этом занятии вы научитесь применять наследование для создания
производных классов на основе базовых, создавать новую реализацию для членов
базовых классов, а также объявлять абстрактные базовые классы,
Изучив материал этого занятия, вы сможете:
•^ расширять возможности базового класса;
^ переопределять и замещать члены базовых классов;
s дать определение понятию абстрактного класса;
^ создавать абстрактные члены.
Продолжительность занятия - около 60 минут.
Наследование
Наследование позволяет создавать классы, реализующие общий набор возможнос-
тей. При этом специализированные классы, которые также называют производны-
ми, являются потомками одного общего класса, называемого базовым. Говорят, что
производные классы расширяют возможности базового. Базовый класс инкапсули-
рует общую функциональность, которой будут обладать все производные классы, а
производные классы поддерживают дополнительные возможности, уникальные для
каждого производного класса. Рассмотрим класс Грузовик, который представляет
всю базовую функциональность автомобиля (например, методы для движения впе-
ред, назад и поворота) и инкапсулирует все необходимые объекты. На его основе
можно создать производный класс Пикап, который унаследует от него всю базовую
функциональность. Далее можно реализовать дополнительные возможности, свой-
ственные только классу Пикап, например добавить свойство Тип_груза. В свою оче-
редь, класс Пикап можно назначит базовым, например, для класса Полноприводной-
_пикап.
Полиморфизм и производные классы
Производный класс, как правило, можно отождествлять с его базовым классом. На-
пример, любой объект класса Полнопрцводнои_пикап также является объектом клас-
са Пикап, а все объекты класса Пикап представляют собой объекты класса Грузовик.
Полиморфизм при наследовании заключается в том, что любой экземпляр произ-
водного класса способен выполнять функции своего базового класса. Так, методу,
требующему объект Грузовик, допустимо передать объект Пикап. Любой производ-
ный класс можно неявно преобразовать в объект своего базового класса, при этом
все члены, реализованные в производном классе, окажутся недоступными, доступ-
ными останутся только члены базового класса.
Создание производных классов
Производные классы объявляют при помощи ключевого слова Inherits (в Visual Basic
.NET) или двоеточия (в С#), Вот пример объявления класса PickupTruck, производ-
ного от класса Truck:
Visual Basic .NET
Public Class PickupTruck
Inherits Truck
Реализация опущена
End Class
Visual C#
public class PickupTruck : Truck
{
// Реализация опущена
!
У производного класса только один предок (базовый класс), но дополнительно
в нем разрешается реализовать один или несколько интерфейсов. Если вы объявля-
ете производный класс, в котором реализовано несколько интерфейсов, следует
сразу после ключевого слова Inherits поместить ключевое слово Implements (Visual
Basic .NET) либо перечислить все интерфейсы после двоеточия, следующего за
именем базового класса (С#),
Visual Basic .NET
Public Class FourWheelDrivePickupTruck
Inherits PickupTruck
Implements IFourWheelDrive
1 Реализация опущена
End Class
Visual C#
public class FourWheelDrivePickupTruck : PickupTruck, IFourWheelDrive
Объявив производный класс, можно добавить к нему дополнительные члены,
реализующие нестандартные возможности.
>- Как объявить производный класс
* в Visual Basic .NET следует указать базовый класс при помощи ключевого слова
Inherits',
• в С# указать базовый класс после двоеточия в той же строке.
Создание запечатанных классов
Иногда требуются классы, которые не способны играть роль базовых. Например,
специализированные классы, предназначенные для использования исключительно
компонентами вашего приложения. Они не пригодятся другим программистам,
поскольку не способны дать своим потомкам никакой полезной функциональнос-
ти. Такие классы можно пометить ключевым словом Nottnheritable (Visual Basic
.NET) или sealed (C#):
Visual Basic .NET
Public Notlnheritable Class AClass
1 Реализация опущена
End Class
Visual C#
public sealed class AClass
{
// Реализация опущена
Наследуемые члену
Как говорилось ранее, производный класс обладает всей функциональностью базо-
вого. В производных классах разрешается не только добавлять новые члены, но и
изменять реализацию унаследованных членов для решения поставленных задач.
Переопределив (override) члены, унаследованные от базового класса, удается изме-
нять их реализацию; Visual Basic .NET также позволяет замещать (shadow) члены,
унаследованные от базового класса. Их можно скрывать, предоставляя взамен но-
вый член с тем же именем, но с совершенно иной сигнатурой, уровнем доступа и
даже типом. С# позволяет вам скрывать (hide) члены, унаследованные от базового
класса, и реализовать взамен член с идентичным именем и сигнатурой, но отлича-
ющийся другими характеристиками. Переопределение, замещение и сокрытие чле-
нов более подробно рассматривается в следующих разделах.
Переопределение членов, унаследованных от базового класса
Чтобы изменить реализацию членов базового класса, следует переопределить их.
Этот механизм позволяет заменить член, унаследованный от базового класса, чле-
ном с тем же именем, но с другой реализацией. Например, класс Автомобиль имеет
метод Ехать_прямо. У производного класса Спортивный_автомобиль реализация
этого метода может отличаться. Переопределять разрешено только свойства и ме-
тоды, унаследованные от базового класса, — переменные и события переопреде-
лять нельзя.
Для объявления другой реализации члена применяют ключевое слово Overrides
(Visual Basic .NET) или override (C#). В новой реализации члена сигнатура, тип воз-
вращаемого значения и уровень доступа должны совпадать с таковыми переопреде-
ляемого члена, например:
Visual Basic .NET
Этот пример предполагает наличие
у базового класса метода GoForwa^d.
Public Class SportsCar
Inherits Car
Объявить переопределяемый метод
Public Overrides Sub GoForward(ByVal Speed As Integer)
Реализация опущена
End Sub
End Class
Visual C#
// Этот пример предполагает наличие
,// у базового класса метода GoForward.
public class SportsCar : Саг
{
public override void GoForward{int Speed)
<
// Реализация опущена
}
;
При вызове переопределенного члена вместо члена, унаследованного от базово-
го класса, вызывается новая реализация члена независимо от контекста вызова. На-
пример, если после преобразования экземпляра производного класса в тип его ба-
зового класса вызвать переопределенный метод, все равно исполняется новая реа-
лизация этого метода. Вызываемый член определяется объектом, а не типом пере-
менной.
Чтобы член базового класса удалось переопределить, он должен быть помечен
ключевым словом Overridable (Visual Basic .NET) или virtual (C#), в противном слу-
чае члены считаются фиксированными и их переопределить нельзя. Вот пример
объявления метода с помощью ключевого слова Overridable (virtual}:
Visual Basic .NET
Public Overridable Sub OverrideMeC)
Реализация опущена
End Sub
Visual C#
public virtual void OverrideMeO
{
// Реализация опущена
}
> Как переопределить член базового класса
1. Убедитесь, что член, который вы пытаетесь переопределить, объявлен с ключе-
вым словом Overridable (virtual), если это не так, этот член не удастся переопреде-
лить, поэтому его придется заместить (скрыть). Как это сделать, рассказано далее.
2. Напишите новую реализацию члена при помощи ключевого слова Overrides
(override).


Теги: .NET

Статьи по теме:

Сборщик мусора
Проверка на уровне формы
Компиляция и исполнение .NET-приложений
Массивы
Интерфейсы CTS
Реализация обработчиков событий
Применение наборов элементов управления
Реализация полиморфизма через наследование
Локальные функции
Отладка элементов управления
Параметризованные свойства
Объектные модели
Рекурсия
Преобразование типов
Установка сборок в GAC
| .NET | Pavel |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | .NET | Реализация полиморфизма через наследование. Регион сайта: Москва и Санкт-Петербург