AS3 разрешает доступ только к определенным свойствам в DisplayObject - PullRequest
1 голос
/ 16 июня 2011

У меня есть получатель в классе, который используется для создания моего свойства skin:DisplayObject только для чтения . Этот класс также имеет свойство body:AvBody, которое используется для определения x y width height и т. Д. Объекта, который, в свою очередь, позиционирует skin.

Я хочу отключить доступ к свойствам x и y для skin, если к ним нет доступа из пространства имен internal (где также расположен AvBody). Возможно ли это?

Примечание: я не могу сделать скин любым типом, кроме DisplayObject (я даже не могу сделать skin классом, который расширяет DisplayObject, потому что это создает проблемы с символами библиотеки).

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Поскольку у вас не может быть отдельного класса скинов, просто поместите скины в пространство имен, к которому имеют доступ только AvBody и AvChild.

0 голосов
/ 16 июня 2011

Нет, насколько я знаю, ты не можешь этого сделать. Но, как упомянул TheDarkIn198 , у вас есть проблема дизайна, на которую стоит обратить внимание. Вместо слияния тела и кожи я бы предложил реализовать функции тела (AvBody) в реальном классе. Или создайте новый класс под названием Body или что-то еще, от чего унаследует каждый объект, имеющий тело.

Но так как я знаю, что вы разрабатываете фреймворк, вам не нужно ограничивать его использование, так как фреймворк будет внутренним, и пользователю фреймворка не потребуется доступ к скину , только для исключительных случаев, поэтому вы можете полностью отключить его через пространство имен. Здесь я надеюсь, что у вас есть методы, которые удовлетворяют все потребности пользователя, например, добавление объекта к другому (наследование, аналогичное addChild). Вы будете удивлены, узнав, что некоторые библиотеки работают. Например, TweenMax делает каждую внутреннюю переменную общедоступной, но в комментарии они ставят /** @private **/.

Так что, на мой взгляд, лучше не ограничивать переменную, а хорошо ее документировать.

0 голосов
/ 16 июня 2011

Я полагаю, что у вас возникли проблемы с дизайном, и вы, вероятно, сможете избежать необходимости или необходимости делать это с некоторой реструктуризацией кода.возможно, вы могли бы объединить skin и avBody в один класс?вы можете решить, и пока давайте предположим, что редизайн не является решением.

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

override public function set x(value:Number, caller:*):void
     {
     if     (caller is AvBody)
            super.x = value;
     }

     //Error:  Incompatible override.

Вы можете просто переопределить сеттеры x и y, отображая ArgumentError, если они вызываются, и вместо этого использовать собственные внутренние сеттеры для свойств x и y, даже еслиэто вроде гетто.

override public function set x(value:Number):void
     {
     throw new ArgumentError("Can not set public 'x' property on Skin class.  Set internal 'posX' property instead");
     }

override public function set y(value:Number):void
     {
     throw new ArgumentError("Can not set public 'y' property on Skin class.  Set internal 'posY' property instead");
     }

internal function set posX(value:Number):void
     {
     super.x = value;
     }

internal function set posY(value:Number):void
     {
     super.y = value;
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...