为什么在AS3中编译此属性/函数名称冲突?

时间:2014-02-05 19:33:10

标签: actionscript-3 class syntax properties

在ActionScript 3.0中,这会编译:

public function set func(value:Function):void
{

}

public function func():void
{

}

这不是:

public function set someVar44(value:int):void
{

}

var someVar44:int;

为什么第一个编译?我想Adobe可能只是专门和任意地决定阻止这个变量并允许它用于函数,但允许它用于函数或变量似乎没有任何意义。我怀疑这里的故事还有更多。我没看到什么?

2 个答案:

答案 0 :(得分:2)

这真的很有意思,并且需要花费大量的时间去挖掘(虽然答案看起来非常明显)。

如您所知,变量/属性不能在具有相同名称的同一范围内声明。因此,set function someVar44()和变量someVar44存在直接冲突(除了尝试初始化变量两次的问题)。相反,如果你尝试过:

public function get func(value:Function):void
{

}

如果出现重复的函数定义错误,您可能会遇到类似的问题。那么为什么set函数似乎允许你通过这些错误?由于setter和getter以访问和改变类的属性而闻名,看起来它们也被视为类属性而不是典型的方法,但事实并非完全如此。实际上,只有setter显示为公共接口的属性,另一方面,getter是一种可以读取喜欢属性的方法。

二传手:

public function set func(value:Function):void

读取与对象的属性完全相同,并且没有任何其他属性与它直接冲突(即 - 没有像var func这样的当前属性。)您没有收到编译器错误。

来自adobe:

set Defines a setter, which is a method that appears in the public interface as a property.

get Defines a getter, which is a method that can be read like a property.

我相信这就是为什么你没有使用set方法得到编译器错误。虽然如果您尝试访问该set方法,则会立即将优先级假定为函数func()。也就是说,如果您尝试this.func = function():void { },您将收到错误:

  

错误#1037:无法分配给方法func

答案 1 :(得分:0)

我可以逻辑地理解为什么第一次编译(在较旧的编译器中)。在考虑对象的实例时,获取obj.func属性应该返回您定义的成员函数,而设置obj.func属性应该调用您定义的setter。这对我来说似乎并不含糊,但正如我们所见,运行时不同意我。

在第二种情况下,你已经定义了一个var(默认为internal范围,因为你没有公开,但那是另一个故事),它在外部可见,隐含地定义了一个getter和setter 。因此,如果有人设置您对象的obj.someVar44属性,他们是在调用setter还是设置变量值?这显然是一种含糊不清和重复的定义。