扩展对象时;为什么在更改对象成员时不使用“ this”而不是“ super”

问题描述

| 这个问题是从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
呼叫,如果确定的话,则没有必要。