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

时间:2011-05-30 11:21:44

标签: flex oop actionscript

这个问题来自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"
      }

     }
    }        

2 个答案:

答案 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电话,如果您确定,则无需这样做。