- •Предисловие
- •Введение в объектно-ориентированное программирование Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм Объект
- •Наследование и полиморфизм
- •Агрегация
- •Апология ооп
- •Демонстрация преимущества объектно-ориентированного программирования на примере системы вывода графических изображений
- •Реализация с помощью структурных технологий
- •Реализация с помощью объектно-ориентированных технологий
- •Создание классов и объектов в actionscript 2.0
- •Основы создания классов и объектов
- •Объектно-ориентированные, объектные и объектно-базированные языки программирования
- •Квалификаторы доступа и методы доступа Get/Set Первая версия класса библиографических карточек
- •Вторая версия класса библиографических карточек
- •Задание 1
- •Наследование и полиморфизм в actionscript 2.0 Наследование
- •Полиморфизм
- •Задание 2
- •Литература
Наследование и полиморфизм в actionscript 2.0 Наследование
Как вы помните, классы могут наследовать другим классам. При этом классами-потомками будут унаследованы все атрибуты и методы родительских классов.
Рассмотрим реализацию наследования на примере класса трехмерных точек, порожденного от уже хорошо знакомого нам класса точек. Новый класс в отличие от базового будет иметь три атрибута, содержащих значения координат по х, у и z. Напомним код родительского класса:
class CPoint
{
var m_x:Number;
var m_y:Number;
function CPoint(x:Number, y:Number)
{
m_x = x;
m_y = y;
}
}
Код класса-потомка:
class CPoint3D extends CPoint
{
private var m_z:Number;
//Конструктор
function CPoint3D(xx:Number, yy:Number, zz:Number)
{
//Вызов конструктора базового класса
super(xx, yy);
m z = zz;
}
}
Реализация наследования в ActionScript 2.0 осуществляется с помощью ключевого слова extends:
class CPoint3D extends CPoint
Буквально эту строку можно перевести так: «класс CPoint 3D расширяет CPoint».
В конструкторе явным образом вызывается конструктор базового, родительского класса:
super(xx, yy);
Хотя в конструктор класса CPoint3D передаются значения трех координат, непосредственная инициализация осуществляется только одного атрибута - m_z, другие значения передаются далее по цепочке в конструктор базового класса.
Полиморфизм
Выше был рассмотрен класс библиографических карточек для случая монографий. Но помимо монографий существуют и другие библиографические источники: статьи, авторефераты и т. д., структуры библиографического описания которых будут различными.
Рассмотрим пример классов библиографических описаний для монографий и журнальных статей. Класс библиографических карточек монографий был рассмотрен выше. Повторим его атрибуты:
Имя автора.
Заглавие.
Издательство.
Год.
Число страниц.
Класс библиографических описаний журнальных статей должен содержать:
Имя автора.
Заглавие.
Название журнала.
Год.
Номер.
Первую страницу статьи.
Последнюю страницу статьи.
Следует заметить, что журнальные статьи могут быть как многостраничными, так и одностраничными. Поэтому при реализации метода, формирующего строку библиографического описания, необходимо обеспечить для одностраничного случая вывод только одной страницы, а не двух одинаковых номеров страниц.
Можно заметить, что атрибуты имя автора, заглавие и год, будут общими для книг и статей. Следовательно, их целесообразно вынести в базовый класс CbibliographicCard (рис. 5). Этот класс также будет предоставлять интерфейс для метода, формирующего строку библиографической записи. Этот метод будет объявлен без реализации, так как его реализации для книг и журнальных статей будут различными. Так как для формирования строки библиографического описания будет использован метод с одним и тем же именем, то мы имеем дело с полиморфизмам.
Так как в нашем случае не существует библиографической карточки вообще, а есть лишь карточки книг и журналов, класс CbibliographicCard является абстрактным, а следовательно объект, являющийся его экземпляром, создан быть не может. Возможно создание экземпляров лишь конкретных классов карточек - для книг или журналов.
Приведем код классов «Библиографическая карточка» CbibliographicCard, «Библиографическая карточка для монографий» CBookCard и «Библиографическая карточка для журнальных статей» CArticleCard. He забудьте, что каждый класс должен быть сохранен в отдельном файле.
//Класс библиографических карточек
//Является абстрактным классом
//его экземпляры созданы быть не могут
class CBibliographicCard
{
//Автор
private var m_sAuthor:String;
//Заглавие
private var m_sTitle:String;
//Год издания
private var m_nYear:Number;
//-----------Методы доступа------------------
//----------------Set------------------------
function SetAuthor(sAuthor:String):Void
{m_sAuthor = sAuthor;}
function SetTitle(sTitle:String):Void
{m_sTitle = sTitle;}
function SetYear(nYear:Number):Void
{m_nYear = nYear;}
//----------------Get-------------------------
function GetAuthor():String{return m_sAuthor;}
function GetTitleO:String{return m_sTitle;}
function GetYearO:Number{return m_nYear;}
//////////////////////////////////////////////
//Конструктор
function CBibliographicCard(sAuthor:String, tlerString, sTi-tle:String,
nYear:Number)
{
//Производим инициализацию атрибутов
m_sAuthor = sAuthor;
m_sTitle = sTitle;
m nYear = nYear;
}
function
GetDescription():String
{
var s:String;
return s;
}
}
//Класс
библиографических карточек для монографий
class CBookCard extends CBibliographicCard
{
//Издательство
private var m_sPublisher:String;
//Число страници
private var m_nPageCount:Number;
//------------Методы доступа------------------
//----------------Set-------------------------
function SetPublisher(sPublisher:String):Void
{m_sPublisher = sPublisher;}
function SetPageCount(nPageCount:Number):Void
(m_nPageCount = nPageCount;}
//----------------Get-------------------------
function GetPublisher():String{return m_sPublisher;}
function GetPageCount():Number{return m_nPageCount;}
//////////////////////////////////////////////
//Конструктор
Рис. 5. Диаграмма библиографических описаний
function CBookCard(sAuthor:String, sTitle:String,
sPublisher:String, nYear: Number, nPage-Count:Number)
{
super(sAuthor, sTitle, nYear);
m_sPublisher = sPublisher;
m_nPageCount = nPageCount;
}
//Формируем описание монографии в виде одной строки
function GetDescription():String
{
return m_sAuthor + " " + m_sTitle + ". "
+ m_sPublisher + ", " + String(m_nYear)
+ ". " + String(m_nPageCount) + " стр.";
}
}
//Класс библиографических карточек для журнальных статей
class CArticleCard extends CBibliographicCard
{
//Название журнала
private var m_sJournal:String;
//Номер журнала
private var m_nNo:Number;
//Первая страница
private var m_nPageBegin:Number;
//Последняя страница
private var m_nPageEnd:Number;
//------------Методы доступа------------------
//----------------Set-------------------------
function SetJournal (sJournal :String):Void
{m_sJournal = sJournal ;}
function SetNo(nNorNumber):Void
{m_nNo = nNo;}
function SetPageBegin(nPageBegin:Number):Void
{m_nPageBegin = nPageBegin;}
function SetPageEnd(nPageEnd:Number):Void
{m_nPageEnd = nPageEnd;}
//----------------Get--------------------------
function GetJournal ():String{return m_sJournal;}
function GeNo():Number{return m_nNo;}
function GetPageBegin():Number{return m_nPageBegin;}
function GetPageEnd():Number{return m_nPageEnd;}
//////////////////////////////////////////////
//Конструктор
function CArticleCard(sAuthor:String, sTitle:String,
sJournal:String, nYear:Number, nNo:Nuinber,
nPageBegin:Number, nPageEnd:Number)
{
//Вызов конструктора базового классa
super(sAuthor, sTitle, nYear);
m_sJournal = sJournal;
m_nNo = nNo;
m_nPageBegin = nPageBegin;
m_nPageEnd = nPageEnd;
}
//Формируем описание статьи в виде одной строки
function GetDescription():String
{
//Создаем часть строки библиографического описания,
//общую как для одностраничных,
//так и для многостраничных статей
var s:String = m_sAuthor + " " + m_sTitle + " / "
+ m_sJournal + ", " + String(m_nYear)
+", №"+ String(m_nNo) + ", C. ";
//Добавляем к ней часть для многостраничного случая
if(m_nPageBegin != m_nPageEnd)
s += String(m_nPageBegin) + "-"
+ String(m_nPageEnd) + ".";
//и для одностраничного случая
else
s += String(m_nPageBegin) + ".";
//Возвращаем строку библиографического описания
return s;
}
}
Обратите внимание, как в классе реализовано формирование строки библиографического описания.
Как видно из приведенного примера, полиморфизм в ActionScript 2.0 осуществляется путем замещения реализации метода, определенного в базовом классе.
