这个问题来自ActionScript上下文,但也可以来自Java。
我作为样本使用的代码来自adobe.com/devnet/flex/articles/flex4_skinning.html。在下面的代码提取中, NoteCard 类具有已启用和已禁用状态,它继承自 SkinnableComponent 类。我的问题是;为什么在启用的setter中我们调用super.enabled = value;而不是this.enabled = value;。我们已经从构造函数创建了NoteCard对象实例,然后我们就不能使用“this”关键字设置 enabled 成员的值。如果您为此交换 super ,编译器不会显示任何错误,但代码无法正常工作。
package
{
import spark.components.supportClasses.SkinnableComponent;
public class NoteCard extends SkinnableComponent
{
public function NoteCard()
{
super();
}
override public function set enabled(value:Boolean) : void
{
if (enabled != value)
invalidateSkinState();
super.enabled = value;
}
override protected function getCurrentSkinState() : String
{
if (!enabled)
return "disabled";
return "normal"
}
}
}
答案 0 :(得分:2)
如果我们使用:
override public function set enabled(value:Boolean) : void
{
if (enabled != value)
invalidateSkinState();
enabled = value;
}
我们将遇到无限循环。这一行:
enabled = value;
将一次又一次地调用同一个setter。
答案 1 :(得分:0)
在这种特殊情况下,您将覆盖类的setter。您可以实现自己的附加代码来处理新设置的值,但是也应该调用超类中的代码,因为您可能不知道基类设置器将执行什么操作(可以使用值设置私有变量)。您必须致电super.setterName = value
以确保这一点。如果您使用this
进行调用,则会在无限循环中调用您实现的setter。您可以省略super
电话,如果您确定,则无需这样做。