受保护的AS3遭到破坏?

时间:2011-08-24 09:17:22

标签: flash actionscript-3 inheritance static instance

我有一个快乐的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。

但是这不计算,而Flash又咆哮着说:

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

在Java中,这没关系。我认为Java是基本OO的参考实现。

如果我从readBaseA方法中删除'static',那么现在它是一个实例方法,我仍然无法从BaseClass实例中读取_A。但有趣的是,我可以从中读到它._A。

就像AS3区分这个受保护的成员和其他对象的受保护成员一样,尽管这些对象可能是与“this”相同类的实例。

有人在野外看到过类似的行为吗?

3 个答案:

答案 0 :(得分:3)

_A受到保护,因此只能从同一个类或它的子类中访问它,因为它在这方面没有被声明为静态“类”实际上意味着“类实例”。

为了澄清,实例a无法访问实例b的私有或受保护属性,无论它们是否具有完全相同的类型,或者是否扩展了另一个。

答案 1 :(得分:3)

如果您使用internal而不是protected实例属性,它将起作用。 (如果这对您来说足够隐私)

ActionScript非常关注protected的含义,来自Adobe:

  

protected - 对同一类和派生类中的引用可见。”

因此它仅适用于特定参考,不幸的是,在您的情况下,它们显然只是实例引用。这可能与构建ActionScript的基于原型的实现有关,其中它仅检查prototype对象而不是constructor对象,以确定是否允许访问受保护的成员。

答案 2 :(得分:2)

它在AS3中的工作方式:

public class BaseClass
{
  protected var _A:uint;
}

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

protected个字段可以从扩展类中访问和覆盖,并且对于任何其他情况都被视为private