Я считаю, что это ограничение ОО-программирования, но не уверен, что именно. Я не эксперт по Flex, но я думал об этом с точки зрения объектно-ориентированного программирования, и вот что я думаю:
Сначала учтите, что при создании объекта Flex (или любой язык OO) автоматически создает копию этого объекта И частную копию своего родительского объекта, который, в свою очередь, создает личную копию своего родительского объекта и т. Д. все дерево объектов. Это может звучать странно, но в качестве примера, когда вы пишете super () в конструкторе, вы вызываете конструктор родительского класса.
Flex имеет то, что он называет «свойствами». Это эквивалентно тому, что в Java было бы частным полем (переменной) члена с общедоступным методом получения и установки. Когда вы объявляете
<local:states>xyz</local:states>
Вы фактически говорите
states = xyz
что, в свою очередь, эквивалентно высказыванию
setStates(xyz)
Важная часть, и это общее правило о свойствах, заключается в том, что setStates - это публичный метод, любой может вызвать его. Однако сам массив состояний является частным. Если вы не объявите один, CustomAdvancedPanel не имеет свойства состояний. Он также не имеет метода setStates или getStates. Однако, поскольку setStates / getStates являются общедоступными, они наследуют их от AdvancedPanel, поэтому он функционирует так, как если бы он имел эти методы. Когда вы вызываете один из этих методов (получить или установить массив состояний), он на самом деле вызывает метод , где он существует , который находится в его родительском объекте AdvancedPanel. Когда AdvancedPanel выполняет метод, значение массива состояний в самой AdvancedPanel считывается или устанавливается. Вот почему, когда вы не переоцениваете какие-либо состояния в CustomAdvancedPanel, все работает отлично - вы думаете, что устанавливаете и получаете массив состояний в CustomAdvancedPanel, но на самом деле за кулисами вы работаете с массивом состояний в родительском объекте AdvancedPanel, прекрасно и хорошо.
Теперь вы переопределяете массив состояний в CustomAdvancedPanel - что происходит? Помните, что объявление свойства во Flex - это то же самое, что объявление частной переменной уровня класса и общедоступных методов получения и установки. Таким образом, вы предоставляете CustomAdvancedPanel частный массив, называемый состояниями и общедоступными методами получения и установки этого массива. Эти геттеры и сеттеры будут переопределять те из AdvancedPanel. Так что теперь ваше приложение будет взаимодействовать с CustomAdvancedPanel таким же образом, но за кулисами вы больше не работаете с методами / переменными AdvancedPanel, а с теми, которые вы объявили в самом CustomAdvancedPanel. Это объясняет, почему при изменении состояния CustomAdvancedPanel часть, унаследованная от AdvancedPanel, не реагирует, поскольку ее отображение связано с массивом состояний в AdvancedPanel, который все еще существует независимо.
Так почему же includeIn не разрешен в базовом примере, где вы не переопределяете состояния? Я не знаю. Либо это ошибка, либо, что более вероятно, существует легитимная языковая / OO причина, по которой он никогда не сможет работать.
Возможно, мое объяснение не совсем точно. Это насколько я понимаю. Я сам не знаю, почему это действительно произойдет, учитывая, что рассматриваемая кнопка является частью суперкласса. Пара интересных тестов будет:
- переместить обработчик щелчка в настоящий открытый метод вместо встроенного.
- добавить super.currentState = 'edit' в обработчик кликов.
Если вы хотите узнать больше обо всем этом наследовании, напишите несколько простых классов в ActionScript или Flex, где один класс наследует другой, и запустите различные вызовы функций, чтобы увидеть, что происходит.