AS3 защищен это забит? - PullRequest
       18

AS3 защищен это забит?

4 голосов
/ 24 августа 2011

У меня радостная головоломка Flash AS3.Учитывая следующий код:

public class BaseClass
{
  protected var _A:uint;
}

public class ExtendedClass extends BaseClass
{
  public static function readBaseA(a:BaseClass) : uint
  {
    return a._A;
  }
}

Итак, вы видите, что статическая функция использует свою способность читать защищенный член BaseClass, чтобы возвращать _A.

Но это не вычисляет, иФлэш лает мне в ответ:

(hidden)\ExtendedClass.as, Line 7   1178: Attempted access of inaccessible property _A through a reference with static type BaseClass.

На Java это нормально.И я считаю Java эталонной реализацией базового OO.

, если я уберу «static» из этого метода readBaseA, так что теперь это метод экземпляра, я все еще не могу прочитать _A из экземпляра BaseClass.Но, что интересно, я могу прочитать это из этого. А. 1011

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

Кто-нибудь видел подобное поведение в дикой природе?

Богатый

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

будет работать, если вы используете internal вместо protected свойства экземпляра.(если вам этого достаточно для конфиденциальности)

ActionScript очень подробно описывает, что означает protected от Adobe:

"protected - Видно для ссылок в одном классеи производные классы. "

Так что он доступен только для ссылок конкретно, и, к сожалению, в вашем случае, они, очевидно, означают только ссылки на экземпляры.Это может быть связано с реализацией на основе прототипов, на которой построен ActionScript, где проверяется только объект prototype, а не объект constructor, чтобы определить, разрешен ли доступ защищенному члену.

3 голосов
/ 24 августа 2011

_A защищен, поэтому к нему можно получить доступ только из одного и того же класса или его подклассов, и поскольку он не объявлен как статический «класс», в этом отношении фактически означает «экземпляр класса».

Для пояснения, экземпляр a не может получить доступ к закрытому или защищенному свойству экземпляра b, независимо от того, имеют ли они точно такой же тип или один расширяет другой.

2 голосов
/ 24 августа 2011

вот как это работает в AS3:

public class BaseClass
{
  protected var _A:uint;
}

public class ExtendedClass extends BaseClass
{
  public function readBaseA() : uint
  {
    return super._A;
  }
}

protected поля могут быть доступны и переопределены из расширенных классов и обрабатываются как private для любого другого случая

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