2011-08-24 97 views
4

我有一个快乐的Flash AS3难题。考虑下面的代码: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方法中删除'静态',所以现在它是一个实例方法,我仍然无法从BaseClass实例读取_A。但有趣的是,我可以从这里读到它。

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

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

丰富

+0

不知道你的问题是什么,但肯定这AS是如何工作的。是否是“错误”是一个意见问题。 –

回答

3

_A的或受保护的,因此只能从同一类内访问它的子类,因为它不是在这方面静态“类”中声明,其实就是“类的实例”。

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

+0

他正在将一个实例传递给静态方法。所以如果'_A'属性是公开的,这实际上是可行的。 – RIAstar

+0

RIAstar:你说得对。纠正我的答案。 – richardolsson

+1

这是一个人为的例子,但是当你用我的真实姓名替换BaseClass,ExtendedClass和_A时有意义。 richardollson在其他更有声誉的语言(如Java)中,这是允许的,即使在没有这个的静态函数中也是如此。 – RichColours

3

它会工作,如果您使用internal而不是protected实例属性。 (如果这是不够的隐私你)

ActionScript是很讲究什么protected手段,从Adobe:

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

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

+1

我即将放弃“封装”,并使整个血腥公开的事情,并把这个项目拿出来!沉闷的语言。 – RichColours

+1

我同意了,几个月前我遇到过类似的问题,我可以隐藏uisng'internal'属性,因为基类和所有的继承类都在一个非常具体的包中,所以对于我来说'内部“和”受保护“恰好为我所做的事提供了非常相似的范围。来自C#,这不是我期望的方式。 –

2

这就是它是如何工作的AS3:

public class BaseClass 
{ 
    protected var _A:uint; 
} 

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

protected字段可以访问和扩展类重写并被视为private对于任何其它情况

+0

readBaseA()在ExtendedClass上是静态的。 那么如果readBaseA()是静态的,super._A如何访问一个实例呢? – RichColours

+0

http://livedocs.adobe。com/specs/actionscript/3/wwhelp/wwhimpl/js/html/wwhelp.htm?href = as3_specification.html详细信息super和this不能在静态函数中使用。 – RichColours

+0

@RichColours - 这是一个愚蠢的复制粘贴错误,修复了我的回答 – www0z0k