Skip to content

Extension Methods (ru)

Dima Kruk edited this page Feb 11, 2013 · 6 revisions

ExtensionMethods - языковое расширение разработано для обеспечения механизма наследования аналогично prototypes.

Метод наследования через “prototype” был во времена ActionScript1 (и все ещё остался в JavaScript). По многим причинам этот подход считается небезопасным. Использование прототипов в чистом виде сейчас заменяют созданием вспомогательных классов. Однако, иногда "распространенный" путь не обязательно означает "оптимальный". Использование ExtendsMethods позволяет объединить преимущества обоих подходов: безопасность и компактный синтаксис.

В отличие от prototypes, расширенные методы не будут наследоваться. Если Вам нужно именно такое поведение, то воспользуйтесь аннотацией [InheritExtensionMethod], описанной ниже.

Синтаксис

extensions-methods Name for class ClassConcept

Для использования ExtensionMethods Вам необходимо импортировать языковое расширение extensionMethods. После этого в контекстном меню пакета появится пункт "New->Extensions-methods". До того, как начать добавлять методы, Вы должны указать имя для extensions-methods и указать имя класса который Вы будете расширять.

extensions-methods AdditionalStringMethods for class String { 
   <<static fields>>

   <<methods>>
}

После Вы можете добавлять методы в секцию <<methods>>.

extensions-methods AdditionalStringMethods for class String { 
   <<static fields>>

   /**
    * this is a sample isUpperCase getter
    */
   public function get isUpperCase() : Boolean {
	   if (this == null || this == "") {return false;} 
	   return this == this.toUpperCase();
   }
}

Затем Вы можете вызвать этот метод у любой строки, так же как обычный метод класса.

/**
 * Main class will look like this
 */
public class Main extends Sprite {
  public function Main() {
    "any string".isUpperCase // assert false
  }
}

##Аннотации

###[InheritExtensionMethod] Если метод extensions-methods помечен этой аннотацией, то все наследники расширяемого класса наследуют расширенный метод.

package codeOrchestra.examples {                                                                                                              
extensions-methods AdditionalDOMethods for class DisplayObjectContainer {

  [InheritExtensionMethod] 
  public function removeAllChildren() : void {
    while (this.numChildren > 0) {
      this.removeChildAt(0);
    } 
  }
}
}
var sprite : Sprite = new Sprite(); 
sprite.removeAllChildren();

Clone this wiki locally