При расширении объекта; почему бы не использовать «это» вместо «супер» при смене членов объекта - PullRequest
0 голосов
/ 30 мая 2011

Этот вопрос задан из контекста ActionScript, но может быть и из контекста Java.

Код, который я использую в качестве примера, взят из adobe.com / devnet / flex / article / flex4_skinning.html . В приведенном ниже фрагменте кода класс NoteCard имеет состояние enabled и состояние disabled , которое он наследует от класса SkinnableComponent . Мой вопрос почему в активированном сеттере мы вызываем super.enabled = value; а не this.enabled = значение ;. Мы создали наш экземпляр объекта NoteCard из конструктора, и тогда мы не сможем установить значение enabled member, используя ключевое слово "this". Если вы поменяете местами 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 ]

2 голосов
/ 30 мая 2011

Если мы будем использовать:

  override public function set enabled(value:Boolean) : void
  {
   if (enabled != value)
   invalidateSkinState();

  enabled = value;
  }

Мы попадем в бесконечный цикл.Эта строка:

enabled = value;

будет снова и снова вызывать один и тот же установщик.

0 голосов
/ 30 мая 2011

В этом особом случае вы переопределяете установщик для класса. Вы можете реализовать свой собственный дополнительный код для обработки вновь установленного значения, но также должен вызываться код из вашего суперкласса, потому что вы можете не знать, что будет делать установщик базового класса (может быть установлена ​​частная переменная со значением). Вы должны позвонить super.setterName = value, чтобы убедиться в этом. Если бы вы звонили с this, вы бы вызвали ваш реализованный сеттер в бесконечном цикле. Вы можете пропустить вызов super, если вы уверены, что в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...