2008-10-18 26 views
5

Ich wollte eine Klasse von Prädikat < IMyInterface> ableiten, aber es scheint, als ob Prädikat <> versiegelt ist. In meinem Fall wollte ich einfach das invertierte (!) Ergebnis der angegebenen Funktion zurückgeben. Ich habe andere Möglichkeiten, um das Ziel zu erreichen. Meine Frage ist, was könnten die MS-Designer gedacht haben, wenn sie sich entscheiden, Prädikat <> zu versiegeln?Warum ist Prädikat <> versiegelt?

ohne viel Gedanken kam ich mit: (a) ihre Prüfung vereinfacht, um nur Zeit vs Kosten Trade-off (b) „nicht gut“ aus Ableiten von Prädikats kommen konnte <>

Was Sie tun denken?

Aktualisierung: Es gibt n Prädikate, die während einer Initialisierungsphase dynamisch zu einer Liste von Prädikaten hinzugefügt werden. Jede schließt sich gegenseitig aus (wenn Abc hinzugefügt wird, wird NotAbc nicht hinzugefügt). Ich beobachtete ein Muster, das wie folgt aussieht:

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 

Es ist nicht, dass ich das Problem nicht lösen kann, sein, dass ich frage mich, warum ich es nicht auf eine bestimmte Weise lösen könnte.

+0

Als Sie "invertiert" sagten, war ich mir nicht sicher, was Sie meinten. Für mich ist die Inverse einer Funktion von A nach B eine Funktion von B nach A. Ich denke, "negiert" könnte klarer sein. Wonach suchen Sie wirklich? –

+0

Es tut mir leid, aber nachdem Sie aktualisiert haben, verstehe ich einfach nicht, was die Frage ist: Fragen Sie, wie Sie eine Liste von Delegaten haben und für diejenigen, die nicht existieren - Sie fügen den negierten Delegaten hinzu? –

Antwort

4

Prädikat ist ein Delegierter. Sie können nicht von einem Delegattyp erben. Wenn Sie den invertierten Wert erhalten möchten, verwenden Sie die folgenden Schritte aus:

Predicate<T> p; 
Predicate<T> inverted = t => !p(t); 
19

Predicate<T> ist ein Delegate-Typ. Sie können niemals von Delegaten ableiten.

Um ehrlich zu sein, klingt es nicht so, als wäre die Vererbung hier wirklich angebracht - schreiben Sie einfach eine Methode, die eine Umkehrung des Originals liefert. So einfach ist das:

public static Predicate<T> Invert<T>(Predicate<T> original) 
{ 
    return t => !original(t); 
} 
2

Die Funktionalität eines Delegaten besteht darin, eine Liste von Typ Safe Method Pointers zu behandeln. C# -Designer haben entschieden, dass dieser Funktionalität nichts hinzuzufügen ist, und es gibt keinen Grund, das Verhalten auf Delegaten zu ändern.

Also, Jon hat Recht, Vererbung ist hier nicht angebracht.

Delegierte können auf eine Liste von Methoden verweisen. Wir fügen diese Liste mit + = operator oder mit Delegate.Combine hinzu. Wenn die Signatur der Methode nicht ungültig ist, wird das Ergebnis der zuletzt aufgerufenen Methode zurückgegeben (wenn ein Rückruf korrekt ist).

Verwandte Themen