| 著作一覧 | 
ちょっとした状態を持つフィルタ処理があって、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のどちらかを使わなければならないような気分になってた)。どうもありがとうございます。