ActionScript - определить класс вызывающего абонента? - PullRequest
0 голосов
/ 21 апреля 2011

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

возможно ли использовать свойство callee аргументов или, возможно, что-то еще, чтобы определить, был ли установщик установленустановить внутренне из класса сеттера или, если он был задан внешне?

вот пример того, что я имею в виду:

package
{
//Class
public class MyLocation
    {
    //Constants
    public static const LOCATION_LEFT:String = "locationLeft";
    public static const LOCATION_RIGHT:String = "locationRight";

    //Properties
    private var sideLocationProperty:String;

    //Constructor
    public function MyLocation(sideLocation:String = MyLocation.LOCATION_LEFT)
        {
        this.sideLocation = sideLocation;

        trace(sideLocation);
        }

    //Texture Panel Is Collapsed Setter
    public function set sideLocation(value:String):void
        {
        if  (value != LOCATION_LEFT && value != LOCATION_RIGHT && value != LOCATION_AUTO)
            throw new ArgumentError("\"MyLocation set sideLocation(value:String)\" – value parameter is not supported.");

        sideLocationProperty = value;

        //pseudo code
        if  (arguments.callee is from MyLocation)
            trace("sideLocation was set internally");
            else
            trace("sideLocation was set externally");
        }

    //Texture Panel Is Collapsed Getter
    public function get sideLocation():String
        {
        return sideLocationProperty;
        }
    }
}

Ответы [ 4 ]

3 голосов
/ 21 апреля 2011

Скорее всего, вы не можете сделать это.

Почему бы тебе не написать

public function setSideLocation(value:String, caller:* = null):void

тогда вы можете делать с ней все, что захотите, например

trace(caller is MovieClip);

или caller.hasOwnProperty(something)

и т.д.

Устанавливая его в null в качестве значения по умолчанию, вам даже не нужно его использовать. Просто по желанию.

Чтобы вызвать его из другого объекта, выполните:

object.setSideLocation("something", this);

Также, чтобы это было согласованно, пишите

public function getSideLocation():String.

2 голосов
/ 21 апреля 2011

Нет, не возможно.

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

0 голосов
/ 22 августа 2014

Это старые вопросы, но если кто-то еще ищет ... попробуйте следующее и проанализируйте трассировку стека, чтобы получить трассировку

(новая ошибка (). GetStackTrace ())

0 голосов
/ 21 апреля 2011

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

...