在 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 可能只是专门和武断地决定阻止它用于变量并允许它用于函数,但允许它用于函数或变量似乎没有任何意义。我怀疑这里还有更多的故事。我没有看到什么?
最佳答案
这真的很有趣,需要大量挖掘才能深入了解(尽管答案似乎非常明显)。
如您所知,变量/属性不能在同一范围内以相同的名称声明。因此 set function someVar44()
和变量 someVar44
直接冲突(除了尝试初始化变量两次的问题)。相反,如果您尝试过:
public function get func(value:Function):void
{
}
您可能会遇到类似的重复函数定义错误问题。那么,为什么 set
函数似乎可以让您克服这些错误呢?由于 setter 和 getter 以访问和改变类的属性而闻名,因此它们似乎也被视为类属性而不是典型的方法,但情况并非完全如此。事实上,只有 setter 显示为公共(public)接口(interface)的属性,另一方面,getter 是一种可以读取属性的方法。
二传手:
public function set func(value:Function):void
完全像对象的属性一样读取,并且没有任何其他属性与其直接冲突(即 - 没有像 var func
这样的当前属性。)您不会收到编译器错误.
来自土坯:
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 { }
,您将收到错误:
Error #1037: Cannot assign to a method func
关于actionscript-3 - 为什么这个属性/函数名称冲突会在 AS3 中编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21586757/