我有一个快乐的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”相同类的实例。
有人在野外看到过类似的行为吗?
富
答案 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