在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可能只是专门和任意地决定阻止这个变量并允许它用于函数,但允许它用于函数或变量似乎没有任何意义。我怀疑这里的故事还有更多。我没看到什么?
答案 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还是设置变量值?这显然是一种含糊不清和重复的定义。