私は、あるクラスをパラメータとして必要とするメソッドを持っています。別のオブジェクト参照へのすべての後続の呼び出しを委任する
def walkOver(IWalker instance) {
def list = [1, 2, 3, 4, 5]
list.each {
instance.enterItem(it)
if (it.isOdd()) {
instance.enterOdd(it)
instance.exitOdd(it)
} else {
instance.enterEven(it)
instance.exitEven(it)
}
instance.exitItem(it)
}
}
基本的には、リストを繰り返し処理し、その要素で特定の操作を行います。
クラスIWalker
は、私が唯一の特定のタスクを実行IWalker
の2つの基本サブクラスを持ってこの
class IWalker {
void enterItem(item) { }
void exitItem(item) { }
void enterOdd(item) { }
void exitOdd(item) { }
void enterEven(item) { }
void exitEven(item) { }
void enterCommon(item) { }
void exitCommon(item) { }
}
のように見えます。また
class OddWalker extends IWalker {
void enterOdd(item) {
println "Odd: $item"
}
void exitOdd(item) {}
void enterCommon(item) {}
void exitCommon(item) {}
}
class EvenWalker extends IWalker {
void enterEven(item) {
println "Even: $item"
}
void exitEven(item) {}
void enterCommon(item) {}
void exitCommon(item) {}
}
私は複合歩行器を持っている - に操作を委譲すべき対応するインスタンスIWalker
の実装
class CompositeWalker extends IWalker {
@Lazy def oddWalker = new OddWalker()
@Lazy def evenWalker = new EvenWalker()
def currentRef = this // default
void enterItem(item) {}
void exitItem(item) {}
void enterOdd(item) {
currentRef = oddWalker
currentRef.enterOdd(item)
}
void exitOdd(item) {
currentRef.exitOdd(item)
currentRef = this
}
void enterEven(item) {
currentRef = evenWalker
currentRef.enterEven(item)
}
void exitEven(item) {
currentRef.exitEven(item)
currentRef = this
}
void enterCommon(item) {
if (currentRef == this) {
// code
} else {
currentRef.enterCommon(item)
}
}
void exitCommon(item) {
if (currentRef == this) {
// code
} else {
currentRef.enterCommon(item)
}
}
}
CompositeWalker
は、対応するオブジェクトにwalkOver
メソッド内のメソッドのすべての後続の呼び出しを委譲します。
現在、私は現在のオブジェクトへの参照を保存し、そのメソッドを呼び出すだけです。
理想的には私があり、私は全くcompositeWalker
内oddWalker
とevenWalker
のメソッドを実装していないこの
class CompositeWalker extends IWalker {
@Lazy def oddWalker = new OddWalker()
@Lazy def evenWalker = new EvenWalker()
void enterItem(item) {
if (item.isOdd()) {
// delegate all IWalker calls to oddWalker
}
}
void exitItem(item) {
// return to current object
}
}
ような何かをしたいと思います。
このようなことは可能ですか?
したがって、 'common'メソッドを呼び出すときに' currentRef'の現在の参照を参照しますか? – lapots
はい、それは 'this'でオーバーライドされていないデリゲートのメソッドを呼び出します – loteq