Плохой опыт с продлением классов - PullRequest
0 голосов
/ 05 сентября 2011

Я уже некоторое время программирую на ActionScript, хотя я едва понимаю, как именно работают классы расширения.Большинство моих проектов были сценариями с одним файлом, так что вы, вероятно, можете представить, что пытаетесь работать с более чем 1000-строчным файлом (это, вероятно, слишком мало для некоторых из вас: P).

Попытки просмотреть многочисленные онлайн-уроки были пугающими и / или сбивающими с толку, и не объясняют, как на самом деле работает расширение.Было бы неплохо найти тот, который описывает каждое необходимое ключевое слово.

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

Main.as (Основной файл)

package {

    import flash.display.Sprite;

    public class Main extends Sprite {

        public function Main () {
            trace(GLOBAL.version); // "1.0"
        }

    }

}

GLOBAL.as (вспомогательный скрипт в том же каталоге):

package {

    public class GLOBAL {

        public static var version:String = "1.0";

    }

}

Похоже, что даже если я специально не импортировал файл GLOBAL.as, он все еще доступен.

Что я спрашиваю у сообщества SO: Как я могучтобы лучше понять, как работает расширение класса, используя файлы в одном и том же каталоге и другом каталоге, используйте основной файл в качестве простого «включающего» и другие файлы в качестве помощников, например добавляя Sprite к сцене.Надеюсь, я не усложняю это.Но по какой-то причине я просто не могу «получить это».

Другое примечание: я работаю с JavaScript намного больше, чем с ActionScript, поэтому любой гуру хочет дать учебник по работес JavaScript на ActionScript будет плюсом!

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

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

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

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

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

Надеюсь, это поможет каким-то образом.

1 голос
/ 05 сентября 2011

расширение классов в ActionScript 3.0 называется Наследование в ООП.

если вы посмотрите документацию ActionScript 3.0, вы увидите, какие классы расширяют или подклассируют другие классы. давайте возьмем MovieClip например:

enter image description here

MovieClip является расширением Sprite , которое является расширением DisplayObjectContainer , которое является расширением InteractiveObject и т. Д.

это означает, что MovieClip содержит не только собственные функции и свойства, но также все функции и свойства Sprite и все функции и свойства, Sprite также унаследовано от DisplayObjectContainer , а все функции и свойства в других классах идут вниз по линии до Object .

поэтому, если вы создадите класс, который расширяет Sprite , вы автоматически получите доступ ко всем нативным и унаследованным функциям и свойствам Sprite. однако у вас не будет доступа к функциям и свойствам MovieClip, поскольку Sprite является подклассом MovieClip .

1 голос
/ 05 сентября 2011

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

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

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

Что касается использования классов в другом каталоге, мы используем синтаксис пакета, чтобы определить, где находится класс.

Например: com.shaz.physics.MyClass

У вас будет папка с именем com. Внутри этой папки будет папка Shaz, внутри этой физики папки, а внутри этого файла MyClass.as. В этом файле MyClass.as пакет будет package com.shaz.physics. Другие классы в других папках, затем нужно будет импортировать ваш класс как: import com.shaz.physics.MyClass

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

public class Math
{
    public static function doSomething():void
    {

    }   
}

Тогда вместо создания экземпляра объекта вы можете просто сделать Math.doSomething();

1 голос
/ 05 сентября 2011

Другое слово для каталога, содержащего сценарии, - «пакет». В AS3 файлы в одном каталоге или пакете автоматически доступны друг другу, поэтому нет необходимости явно импортировать их. Файлы в подкаталогах не импортируются автоматически, а также не являются родительскими папками.

Что касается структуры ваших классов и их взаимодействия, я бы рекомендовал ознакомиться с шаблонами проектирования ООП. Книга Gang of Four является отличным справочником, хотя она не имеет отношения к AS3, или, наоборот, O'Reilly публикует более конкретную Adobe Developer Library справочник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...