著作一覧 |
ちょっとした状態を持つフィルタ処理があって、Javaだったら次のように書くところだ。
interface Filter { Filter filtrate(string, Writer wtr); } static Filter state1 = new StateA(); static Filter state2 = new StateB(); ... Filter filter = state1; for (;;) { String s = ifile.readLine(); if (s == null) { break; } filter = filter.filtrate(s, wtr); } ... wtr.close();
上でフィルタは受け取った行を処理し、次の状態を判断してそれを返す。
で、C#で作るのだから、クラスみたいな上っ面はいらなくて、多分デリゲートというかラムダでどうにかなるんじゃないかと思った。
で、まずは、上のfiltrate相当のメソッドを定義してみて
Func<string, TextWriter
まで書いてはたと気づく。このデリゲートが返すのは、第一パラメータにstring、第2パラメータにTextWriterを取るデリゲートだ。ということは、
Func<string, TextWriter, Func<string, TextWriter, Func<string...
書けない。
というわけで、interfaceというか、Classのような上っ面が必要なのかなぁと、Javaで書くのと同じようにinterfaceとclassで実装したのであった。
ジェズイットを見習え |
Funcを使わなければ、<br>delegate Filter Filter(string text, TextWriter writer);<br>Filter stateA = null;<br>Filter stateB = (x, y) => { DoSomething(); return stateA; }<br>みたいなことはできますね。
ああ、そうか。それ自体を返す形で書けば良いわけですね(なんとなく、ActionかFuncのどちらかを使わなければならないような気分になってた)。どうもありがとうございます。