问题描述
|
这个问题是从ActionScript上下文提出的,但同样可以来自Java。
我作为示例使用的代码来自adobe.com/devnet/flex/articles/flex4_skinning.html。在下面的代码摘录中,NoteCard类具有从SkinnableComponent类继承的启用和禁用状态。我的问题是;为什么在启用的设置器中我们调用super.enabled = value;而不是this.enabled = value;。我们已经从构造函数创建了NoteCard对象实例,然后我们应该不能使用\“ this \”关键字来设置已启用成员的值。如果您为此进行超级交换,则编译器不会显示任何错误,但是代码无法正常工作。
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\"
}
}
}
解决方法
如果我们使用:
override public function set enabled(value:Boolean) : void
{
if (enabled != value)
invalidateSkinState();
enabled = value;
}
我们将陷入无限循环。这行:
enabled = value;
将一次又一次地调用相同的二传手。
, 在这种特殊情况下,您将覆盖类的设置器。您可以实现自己的附加代码来处理新设置的值,但是也应该调用您超类中的代码,因为您可能不知道基类设置器将执行的操作(可以使用值来设置私有变量)。您必须致电super.setterName = value
以确保这一点。如果您要呼叫this
,则会无限循环地调用已实现的setter。您可以省略super
呼叫,如果确定的话,则没有必要。