This version of the page http://www.homeware.com.ua/105979.php (0.0.0.0) stored by archive.org.ua. It represents a snapshot of the page as of 2008-12-31. The original page over time could change.
Все про ActionScript в деталях и не только... - wfsection-ActionScript 2.0 для пользователей ActionScript 1.0: часть третья. Наследование и интерфейсы
Первая • Новости • Форум • Мой профиль • Поиск • Регистрация
Меню сайта
Материалы
Login
Пользователь:

Лозунг:


Забыли лозунг?

Регистрация
Реклама



ActionScript 2.0 для пользователей ActionScript 1.0: часть третья. Наследование и интерфейсы
Сочинитель: action ((download Prison of the Dead))
Опубликовано: Wed, 09-Nov-2005
Рейтинг 7.43
Оценок: 7
читать: 3789 время
Размер статьи: 21.97 KB


Сочинитель: Joey Lott [http://www.homeware.com.ua/] В передовых двух частях [часть 1 | часть 2] мы рассматривали конструкцию и синтаксис разрядов в ActionScript 2.0. Мы узнали, как создавать разряды в ActionScript 2.0, включая использование пакетов, участников разряда с р

О наследовании


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


Например, вы хотите создать разряд Car, похожий тому, что мы создавали в прежних частях статьи. Ясно, что Автомобиль — это один из многих видов Машины, помимо Автомобилей существуют Вертолеты, Дрезины, Джипы, Терминаторы и т.д. Хотя Машины и отличаются друг от друга, у них есть много всеобщего. Все вышеперечисленные машины могут иметь подобные качества, как "грузоподъемность" или "пробег" (для Самолетов — "пролет"). А если Машина еще и передвигается в месте, у нее есть методы для перемещения с заданной скоростью.


Так вот, если вы создадите суперкласс Vehicle (т. е. "Машина"), то можно в него поместить все всеобщие для машин характеристики (качества и методы). При этом код будет написан только в одном пространстве, а использовать его можно будет во многих пространствах: во всех подклассах разряда Машины. Для изделия суперкласса не нужно быть чемпионом по программированию среди домохозяек (или домохозяинов). Просто берете и создаете суперкласс, как раньше создавали обыкновенные разряды. А вот чтобы наследовать от этого разряда (другими выражениями, расширить его), потребуются небывалая техника. Довольно легкая в освоении.


Расширение суперкласса


В терминах ООП можно сказать, что подкласс расширяет (extends) суперкласс. В нашем образчике подкласс Car расширяет суперкласс Vehicle. чтобы Flash создал подобную связь между ними, нужно при объявлении подкласса использовать ключевое выражение extends:


class Subclass extends Superclass {
}

В инциденте с Автомобилем и Машиной получится приблизительно следующее:


class Car extends Vehicle {
}

Вы всего один раз говорите, что разряд Car расширяет разряд Vehicle, и получаете при этом в свое распоряжение все качества и методы разряда Vehicle, как будто бы они были определены в разряде Car.


Вызов перекрытых методов суперкласса


часто возникает ситуация, когда в подклассе необходимо унаследовать метод суперкласса без любых-либо изменений в этом методе. В таких инцидентах в определением подкласса просто не нужно ничего делать с этими методами. Но во многих иных инцидентах метод суперкласса может быть перекрыт — для реализации в известном методе особенностей подкласса. Это называется перекрытием (overriding) метода суперкласса, поскольку при этом подкласс определяет в себе личную реализацию метода, какая перекрывает унаследованную, родительскую.


Перекрывать методы суперкласса можно по-различному:




  1. Вы можете перекрыть метод полностью, так что реализация метода в суперклассе будет полностью проигнорирована;


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

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


// Метод определен в суперклассе
public function display():Void {
trace("Это метод суперкласса");
}

Потом можно определить реализацию метода в подклассе, какая перекроет реализацию этого метода в суперклассе:


// Метод определен в подклассе
public function display():Void {
trace("Это метод подкласса");
}

Это был первый подход.


Если же вы хотите реализовать в подклассе метод, который будет вызывать также свою реализацию в суперклассе, можете использовать ключевое выражение super, чтобы ссылаться на суперкласс и явно вызывать его метод из метода подкласса. Например, образчик с методом display() в подобном инциденте можно переписать последующим ликом:


// Метод определен в подклассе, происходит вызов метода суперкласса
public function display():Void {
super.display();
trace("Это метод подкласса");
}

Затем, если из экземпляра подкласса вызвать метод display() подкласса, в панели Output увидим следующее:


Это метод суперкласса
Это метод подкласса

Ссылку super можно использовать в пространстве подкласса. Например, вызов super() будет ссылаться на метод конструктора суперкласса. Это пригодится, если вы хотите, чтобы конструктор подкласса выполнял некие деяния, уникальные для подкласса, но в то же время вы хотите вызывать конструктор суперкласса, передавая ему известные настоящие значения. Единственное извещение: конструктор суперкласса должен всегда вызываться в передовой линии конструктора подкласса, если вы вызываете его явно. В ложном инциденте получите опечатку компиляции.

Изделие разрядов Машины и Автомобиля


Конец теории. Выполним упражнение. Создадим суперкласс Vehicle (Машина) и подкласс Car (Автомобиль). Если вы сделали упражнение из Простое постельное белье: arti данной статьи, то вам будет легко следить за мыслью.




  1. Создайте конструкцию директорий для пакета com.person13. Например, D:\Swf\Classes\com\person13;


  2. Откройте небывалый ActionScript-файл;


  3. Добавьте в него такой код:

    class com.person13.Vehicle {
    private var _nPassengers:Number;
    private var _nMiles:Number;
    private var _nInterval:Number;
    function Vehicle(nPassengers:Number, nMiles:Number) {
    _nPassengers = nPassengers;
    miles = nMiles;
    }
    public function get passengers():Number {
    return _nPassengers;
    }
    public function get miles():Number {
    return _nMiles;
    }
    public function set miles(nMiles:Number):Void { if(nMiles >= 0) {
    _nMiles = nMiles;
    }
    else {
    _nMiles = 0;
    }
    }
    public function move(nMPH:Number):Void {
    if(nMPH == null || nMPH <= 0) {
    clearInterval(_nInterval);
    }
    else {
    _nInterval = setInterval(this, "increment", 1000, nMPH);
    }
    }
    private function increment(nMPH:Number):Void {
    _nMiles += nMPH;
    }
    }


  4. Сохраните файл как Vehicle.as в директории com/person13;


  5. Откройте файл разряда Car.as (мы создавали его во Мебель ) (по идее он должен был остаться в директории com/person13 ). В ложном инциденте откройте небывалый ActionScript-файл;


  6. Добавьте в файл Car.as код (или напишите заново, если вы все же поленились сделать упражнение из другой части). Должно получиться так:

    // Разряд Car расширяет разряд Vehicle и наследует все его качества и методы
    class com.person13.Car extends com.person13.Vehicle{
    // Объявляем только качества, особенные для разряда Car.
    // Остальные качества наследуются, так что не надо объявлять их заново.
    private var _sMake:String;
    private var _sModel:String;
    private var _nYear:Number;
    function Car(sMake:String, sModel:String, nYear:Number, nPassengers:Number, nMiles:Number) {
    // Вызываем конструктор суперкласса, затем присваиваем значения
    // качеств, особенных для разряда Car.
    super(nPassengers, nMiles);
    _sMake = sMake;
    _sModel = sModel;
    year = nYear;
    }
    public function get make():String {
    return _sMake;
    }
    public function get model():String {
    return _sModel;
    }
    public function get year():Number {
    return _nYear;
    }
    public function set year(nYear:Number):Void {
    if(nYear >= 1886) {
    _nYear = nYear;
    }
    else {
    _nYear = 1886;
    }
    }
    // Определяем метод drive(), который на настоящем действии вызывает метод move(),
    // унаследованный из суперкласса Vehicle. Именно так делать не обязательно, но
    // лучше все же делать так, настоящему же потом разобраться легче будет,
    // поскольку термин "drive" больше подходит для машины, чем "move".
    // Подобным ликом, API для разряда Car будет интуитивно понятнее.
    public function drive(nMPH:Number):Void {
    move(nMPH);
    }
    }


  7. Сохраните файл Car.as в директории com/person13, где перед этим сохраняли Vehicle.as;


  8. Возьмите .fla-файл, созданный ранее во другой части. Или создайте небывалый .fla-файл;


  9. Как бы там ни было, в первом кадре этого .fla-файла должен оказаться такой код:

    import com.person13.*;
    function displayMileage(carObj:Car):Void {
    trace(carObj.miles);
    }
    var car:Car = new Car("Oldsmobile", "Alero", 2000, 5, 43000);
    car.drive(65);
    setInterval(displayMileage, 100, car);


  10. Теперь можно делать Test Movie. В панели Output вы увидите пробег автомобиля в милях. количество будет увеличиваться раз в секунду, потому что автомобиль едет.

    [Добровольная часть для охотников воздушных инструментов]



  11. Откройте небывалый ActionScript-файл;


  12. Добавьте в него такой код:

    class com.person13.Plane extends com.person13.Vehicle{
    private var _sMake:String;
    private var _sModel:String;
    function Plane(sMake:String, sModel:String, nPassengers:Number, nMiles:Number) {
    super(nPassengers, nMiles);
    _sMake = sMake;
    _sModel = sModel;
    }
    public function get make():String {
    return _sMake;
    }
    public function get model():String {
    return _sModel;
    } public function fly(nMPH:Number):Void {
    move(nMPH);
    }
    }


  13. Сохраните файл как Plane.as в директории in the com/person13;


  14. Создайте небывалый .fla-файл;


  15. Добавьте такой код в первый кадр:

    import com.person13.*;
    function displayMileage(obj:Plane):Void {
    trace(obj.miles);
    }
    var plane:Plane = new Plane("Boeing", "747", 300, 100000);
    plane.fly(400);
    setInterval(displayMileage, 100, plane);


  16. Теперь — TestMovie.

Расширение подклассов


Вы не ограничены одним уровнем наследования. Подкласс тоже можно расширять. Также как и подкласс подкласса-подкласса-подкласса -подкласса. Например, можно создать разряд Niva, который будет расширять разряд Car, или создать разряд Kukuruzniq, расширяющий разряд Plane. Спор изделия таких подклассов аналогичен описанной выше последоватьельности деяний и не зависит от наличия суперкласса у расширяемого подкласса.


Об интерфейсах


Интерфейсы — это просто. Это набор правил, в соотношении с какими реализуется известный набор разрядов. Когда вы определяете разряд, который следует началам интерфейса, то говорят, что разряд реализует (иногда на жаргоне говорят — "имплементит", от англ. "implements") интерфейс.


Любые начала определяются в интерфейсе? Интерфейс в ActionScript 2.0 сообщает Flash, любые методы должны реализоваться в разряде, включая последующую информацию:




  • Имя метода;


  • Входные параметры;


  • Публичное объявление метода (объявления методов с строем доступа private или static в интерфейсе недопустимы);


  • Вид возвращаемого значения.

В интерфейсе недопустимы:




  • Объявления качеств;


  • Реализации методов;


  • Объявления методов с строями доступа private или static.

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


Достоинства интерфейсов


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


Реальное величие интерфейсов видится с некого расстояния. если вы создаете один разряд для одного добавления, то интерфейсы вам и не нужны. И не все разряды обязаны реализовать интерфейс. Но если вы работаете в команде, а план не малый — тут интерфейсы приходят на выручку, помогая создавать главные вехи плана, что повышает эффективность спора не только на этапе разработки иерархии разрядов добавления, но также и на этапе применения этих разрядов.


Например, вы работаете в команде, какая создает разряды Vehicle (Машина), Animal (Животное), Wind (Ветер) и Planet (Планета). В то время как у ежедневного из этих разрядов может быть личный API, между ними есть и общее — все они способны двигаться. Если вы хотите реализовать движение в ежедневном из этих разрядов, можно создать интерфейс IMoveable, который будет реализовываться всеми этими разрядами. Интерфейс IMoveable будет содержать объявление метода move(), так что теперь ежедневный настоящий человек, работающий над реализацией настоящего разряда, будет учитывать этот случай в споре разработки и реализует метод move() в разрабатываемом им разряде. Это большой плюс при командной работе. Когда вы создаете интерфейс и определяете, любые разряды будут его реализовать, то потом все разработчики, работающие над разрядом, будут заранее знать, любые методы писать, и это облегчает стандартизацию API всех разрядов. Еще одно достоинство получает разработчик, использующий такой разряд. Зная, любой именно настоящий интерфейс реализуется в разряде, вы ужен знаете много о своем API.


Один разряд может реализовывать многочисленные интерфейсы. Поэтому интерфейсы часто используются как выкройка множественного наследования в диалектах, изначально не поддерживающих такой лик наследования. В ActionScript подкласс может наследовать только от одного суперкласса. Например, разряд Car расширяет разряд Vehicle, и следовательно не может расширять ни один иной разряд. Но Car может реализовывать множественные интерфейсы (продолжая при этом наследовать от разряда Vehicle.) Например, Car может реализовать интерфейсы вида IDrivable (автомобиль можно водить), IManufacturable (можно производить), ISellable (можно продать).


Изделие интерфейса


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


Декларация (объявление) интерфейса выглядят почти идентично декларации разряда. Единственное различие в том, что при объявлении интерфейса используется ключевое выражение interface, вместо ключевого выражения class. Например:


interface IMoveable {
// Определение интерфейса
}

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




  • Имя метода;


  • Имя и вид ожидаемого параметра;


  • Объявление открытых методов;


  • Вид возвращаемого значения.

Вот образчик отделанного интерфейса IMoveable:


interface IMoveable {
public function move(nMPH:Number):Void;
}

Как и разряды, интерфейсы удобно хранить в пакетах. Например, можно упаковать IMoveable в пакет com.person13. В декларации интерфейса это выглядит вот так:


interface com.person13.IMoveable {
public function move(nMPH:Number):Void;
}

И также, как и разряды, интерфейсы могут расширять друг друга Например, IDrivable может расширять IMoveable, вот как будет при этом выглядеть код:


import com.person13.IMoveable
interface com.person13.IDrivable extends IMoveable {
public function drive(nMPH:Number):Void;
}

Реализация интерфейса


После определения интерфейса можно указать, что известный разряд реализует этот интерфейс. Для этого используется ключевое выражение implements, за которым будет следовать список разделенных запятыми реализуемых интерфейсов. Например, если разряд Vehicle реализует интерфейс IMoveable, то начинание объявления разряда будет выглядеть так:


class com.person13.Vehicle implements com.person13.IMoveable {

Конечно, при этом можно пользоваться импортом (как и с разрядами):


import com.person13.IMoveable;
class com.person13.Vehicle implements IMoveable {

А вот разряд Car реализует интерфейсы IDrivable, IManufacturable, и ISellable:


import com.person13.*;
class com.person13.Car implements IDrivable, IManufacturable, ISellable {

Когда разряд реализует интерфейс, Flash будет проверять правильность этой реализации во время компиляции. И если любой-то метод пропущен или объявлен неверно, не так, как в интерфейсе, то Flash выдаст известие об опечатке.


(От толмача: подобным ликом, легко понять мощь компиляции. Интерфейсы являются таковыми прежде всего для разрядов, прокладывая между "городами" различных разрядов "тропы" объявленных в интерфейсе методов. Как будто различные разряды (читайте — разработчики различных разрядов) подписали виртуальный уговор о сотрудничестве. После подписания такого уговора ежедневный разряд-дольщик уговора обязан реализовать все объявленные в уговоре-интерфейсе методы. А поскольку "за исполнением положений уговора" следит сама среда разработки Flash, на этапе компиляции указывающая на отклонения от уговора, то можно не сомневаться в соблюдении положений. Гениальное открытие!)


Вывод


Вот и разобрались. Комментарии приветствуются как никогда. Спасибо :]


Белорусская мебель




1 2 3 4 5 6 7 8 9 10
[ Вернуться в раздел | Вернуться на первую страницу ]
Комментарии принадлежат их сочинителям. Мы не несем ответственности за их содержание.
ActionScript 2.0 для пользователей ActionScript 1.0: часть третья. Наследование и интерфейсы
© copyright 2008 action & Все про ActionScript в деталях и не только...
Реклама
Электронная тайна по изделию флеш-потех

Хотите научится создавать флеш-потехи? Нет ничего проще!

Флеш-исходники
Рассылки сайта
Content.mail.ru
Программирование в Macromedia Flash ActionScript от А до Я
Subscribe.Ru
Пользительные приемы в Macromedia Flash
ActionScript
Maillist.ru
Программирование в Macromedia Flash
ActionScript
Who's Online
2 пользователь(ей) активно (2 пользователь(ей) просматривают Библиотека статей)

Дольщиков: 0
Посетителей: 2

далее...
New Members
FENGshui 13/07/2008
zhorra 11/07/2008
Yakh 05/07/2008
maltcev 28/06/2008
VsevMart 25/06/2008
dokumentrf 23/06/2008
weberart 21/06/2008
ijojeg 19/06/2008
seomaz 19/06/2008
deos 18/06/2008

Copyright © 2004-2006