5

Predicate<IMyInterface> からクラスを派生させたかったのですが、Predicate<> が封印されているように見えます。私の場合、指定された関数の反転 (!) 結果を単純に返したいと考えていました。目標を達成するための他の方法があります。私の質問は、Predicate<> を封印することを決定したとき、MS の設計者は何を考えていたのでしょうか?

私が思いついたのは、あまり考えずに: (a) テストを単純化し、時間とコストのトレードオフだけです (b) Predicate<> から派生することで「ダメ」になる可能性があります

どう思いますか?

更新: 初期化フェーズ中に述語のリストに動的に追加される n 個の述語があります。それぞれが相互に排他的です (Abc が追加された場合、NotAbc は追加されません)。次のようなパターンを観察しました。

bool Happy(IMyInterface I) {...}
bool NotHappy(IMyInterface I) { return !Happy(I); }
bool Hungry(IMyInterface I) {...}
bool NotHungry(IMyInterface I) { return !Hungry(I); }
bool Busy(IMyInterface I) {...}
bool NotBusy(IMyInterface I) { return !Busy(I); }
bool Smart(IMyInterface I) {...}
bool NotSmart(IMyInterface I) {...} //Not simply !Smart

問題を解決できないのではなく、なぜ特定の方法で解決できなかったのか疑問に思っている.

4

3 に答える 3

20

Predicate<T>デリゲート型です。デリゲートから派生することはできません。

正直なところ、ここでは継承が本当に適切であるようには思えません。元の逆を返すメソッドを作成するだけです。次のように簡単です。

public static Predicate<T> Invert<T>(Predicate<T> original)
{
    return t => !original(t);
}
于 2008-10-18T15:14:39.443 に答える
4

述語はデリゲートです。デリゲート型から継承することはできません。反転した値を取得する場合は、次を使用します。

Predicate<T> p;
Predicate<T> inverted = t => !p(t);
于 2008-10-18T15:14:01.397 に答える
2

デリゲートの機能は、タイプ セーフなメソッド ポインターのリストを処理することです。C# の設計者は、この機能に追加するものは何もなく、動作をデリゲートに変更する理由はないと判断しました。

したがって、Jon は正しく、ここでは継承は適切ではありません。

デリゲートは、メソッドのリストを指すことができます。+= 演算子またはDelegate.Combineを使用して、このリストに追加します。メソッドのシグネチャが void でない場合、最後に呼び出されたメソッドの結果が返されます (リコールが正しく行われた場合)。

于 2008-10-20T08:34:48.160 に答える