ある条件にマッチしたものだけに特定の処理を行いたいという要件がありました。 条件自体は選択可能で実行時に決定されます。 最初は条件用のクラスを書いていたんですが、ふとデリゲートでもいいんじゃないかと思って、どこまでかけるか試して見ました。
まずは簡単に、匿名メソッドとマルチキャストデリゲートの説明を。
// 単なるデリゲートの定義
delegate bool Filter(Entity aEntity);
// 匿名メソッドを使ってデリゲートを設定
Filter tFilter = delegate(Entity aEntity) { return aEntity.Visible; }
// マルチキャストデリゲート(同じデリゲートに追加。)
tFilter += delegate(Entity aEntity) { return aEntity.Locked; }
// デリゲートの実行
bool tReturn = tFilter(aEntity);例では、Visible == trueかつLocked == trueの場合、trueを返します。 このようにフィルターをある程度自由に組み替えつつ、複数組み合わせるケースには使えるかもしれません。
このデリゲートをプロパティとして持つクラスを定義してみましたが
public class FilterSet
{
private Filter mFilter;
public Filter Filter
{
get { return this.mFilter;}
}
}これはダメでした。FilterSet.Filter += …で書き込み権限がないと怒られます。
パブリックなメンバー変数として持った場合。
public class FilterSet
{
public Filter Filter;
}これはいけました。
なんとなくpublicはいやだなぁ。。。ということで、一工夫。
public class FilterSet
{
private Filter mFilter;
public event Filter
{
add { this.mFilter += value; }
remove { this.mFilter -= value; }
}
public bool Accept(Entity aEntity)
{
return this.mFilter(aEntity);
}
}
}これもOK。微妙ですけど(笑
