-
Notifications
You must be signed in to change notification settings - Fork 0
Extension Methods (ru)
ExtensionMethods - языковое расширение разработано для обеспечения механизма наследования аналогично prototypes.
Метод наследования через “prototype” был во времена ActionScript1 (и все ещё остался в JavaScript). По многим причинам этот подход считается небезопасным. Использование прототипов в чистом виде сейчас заменяют созданием вспомогательных классов. Однако, иногда "распространенный" путь не обязательно означает "оптимальный". Использование ExtendsMethods позволяет объединить преимущества обоих подходов: безопасность и компактный синтаксис.
В отличие от prototypes, расширенные методы не будут наследоваться. Если Вам нужно именно такое поведение, то воспользуйтесь аннотацией [InheritExtensionMethod], описанной ниже.
Для использования 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();