Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мультимедия технологии в пС.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
307 Кб
Скачать
☆

Наследование и полиморфизм в 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, другие значения передаются далее по цепочке в конструктор базового класса.

Полиморфизм

Выше был рассмотрен класс библиографических карточек для случая монографий. Но помимо монографий существуют и другие библиографические источники: статьи, авторефераты и т. д., структуры библиографического описания которых будут различными.

Рассмотрим пример классов библиографических описаний для монографий и журнальных статей. Класс библиографических карточек монографий был рассмотрен выше. Повторим его атрибуты:

  1. Имя автора.

  2. Заглавие.

  3. Издательство.

  4. Год.

  5. Число страниц.

Класс библиографических описаний журнальных статей должен содержать:

  1. Имя автора.

  2. Заглавие.

  3. Название журнала.

  4. Год.

  5. Номер.

  6. Первую страницу статьи.

  7. Последнюю страницу статьи.

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

Можно заметить, что атрибуты имя автора, заглавие и год, будут общими для книг и статей. Следовательно, их целесообразно вынести в базовый класс 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 осуществляется путем замещения реализации метода, определенного в базовом классе.