Обрабатываются ли теги метаданных Flex / AS3 в определениях интерфейса иначе, чем в определениях классов? - PullRequest
3 голосов
/ 30 октября 2009

Если я использую теги метаданных перед интерфейсом, это то же самое, что и перед классом? Я могу сделать

[Event(name="fooUpdate", type="com.acme.events.FooEvent")
public interface IFoozer extends IEventDispatcher
{
}

// ... now omit that metadata in the implementations ...

public class Foozer extends EventDispatcher implements IFoozer
{
    public function set bar(b:Bar):void
    {
        this.dispatchEvent(new FooEvent(FooEvent.FOO_UPDATE));
    }
}

// ... and expect it to be known in MXML ...

<acme:Foozer fooUpdate="myUpdateHandler">
  <!-- ... -->
</acme:Foozer>

Или, аналогично, с [Bindable]?

Ответы [ 2 ]

5 голосов
/ 30 октября 2009

да и нет ... для [Event] да ... но [Bindable] - это не просто тег метаданных ... [Bindable] (без аргументов !!) инструктирует компилятор генерировать код AS3, который сделает уверен, что PropertyChangeEvent отправляется, если вы устанавливаете свойство (вы можете видеть, что если вы разрешите mxmlc сохранять сгенерированный код AS3) ...

также, для [Embed] это не тот случай (за [Embed] должна следовать переменная. Интерфейсы не могут иметь переменных) ... вы всегда сможете получить метаданные через flash.utils::describeType ... this является довольно противоречивым, так как некоторые теги метаданных действительно предоставляют только метаданные, скомпилированные в вывод, а некоторые метаданные инструктируют компилятор действительно предпринимать действия ... тем не менее, метаданные, предоставляемые некоторыми тегами, настолько интенсивно используются флексической средой, что они становятся языковая особенность в MXML (как [Event]) ... но они не в AS3 ... однако AS3 представляет собой довольно близкое представление о том, что происходит на виртуальной машине, тогда как MXML и Flex Framework оба слабо связаны с ней .. Именно поэтому классы ActionScript и компоненты MXML очень ужасно взаимодействуют (вы могли заметить, что в MXML отсутствует концепция интерфейсов, потока выполнения (и, следовательно, времени), в то время как в AS3 нет концепции событий или привязок (которые являются «родными» в MXML, но построены на основе AS3 с использованием некоторых метаданных, и пакет flash.events, выглядящий очень хорошо в MXML, но впечатляющим количеством вызовов и реализаций в AS3)) ...

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

Итак, вернемся к старой школьной фразе: интерфейс требует поведения, класс обеспечивает реализацию ... [Event(name="fooUpdate", type="com.acme.events.FooEvent")] - это чистые метаданные ... а метаданные - это реализация в мире AS3, потому что это не требует, чтобы кто-либо что-либо делал (вы могли бы просто написать [Bar(foo="123")]) ... это тег, помещаемый поверх класса, тогда и только тогда, когда у класса есть эта строка где-то в его реализации: this.dispatchEvent(new FooEvent(FooEvent.FOO_UPDATE)); ... вы пытаетесь сказать, что любая реализация IFoozer отправит FooEvent.FOO_UPDATE ... это гарантия, которую компилятор не может предоставить, потому что он не проверяет метаданные по сравнению с реализацией ...

надеюсь, что помогло ...

1 голос
/ 30 октября 2009

Вы можете определить [Event] метаданные в интерфейсах для информационных целей, но в отличие от функций, вы не можете заставить эти реализации использовать эти события. По моему опыту, вы должны переопределить события в классах реализации.

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