2008-10-18 9 views
5

Quería derivar una clase del predicado < IMyInterface>, pero parece que el predicado <> está sellado. En mi caso, quería simplemente devolver el resultado invertido (!) De la función designada. Tengo otras formas de lograr el objetivo. Mi pregunta es ¿en qué podrían haber estado pensando los diseñadores de MS al decidir sellar Predicate <>?¿Por qué se sella el predicado <>?

Sin pensarlo mucho me ocurrió: (a) simplificado sus pruebas, sólo una vez contra el comercio coste fuera (b) "no es bueno" podrían provenir de derivados de predicado <>

¿Qué haces ¿pensar?

Actualización: hay n predicados que se agregan dinámicamente a una lista de Predicados durante una fase de inicialización. Cada uno es mutuamente exclusivo (si se agrega Abc, no se agregará NotAbc). He observado un patrón que se parece a:

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 

No es que no puedo resolver el problema, su que me pregunto por qué no podía resolverlo de una manera determinada.

+0

Cuando dijiste "invertido" no estaba seguro de lo que querías decir. Para mí, el inverso de una función de A a B es una función de B a A. Creo que "negado" podría ser más claro. ¿Qué es lo que realmente estás buscando? –

+0

Lo siento, pero después de que lo actualizaste, simplemente no entiendo cuál es la pregunta: ¿estás preguntando cómo tener una lista de delegados y para los que no existen, agregas el delegado negado? –

Respuesta

4

Predicate es un delegado. No puede heredar de un tipo de delegado. Si desea obtener el valor invertido, utilice la siguiente:

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

Predicate<T> es un tipo de delegado. Nunca se puede derivar de los delegados.

Para ser sincero, de todos modos, no parece que la herencia sea realmente apropiada, solo escriba un método que devuelva un inverso al original. Es tan simple como esto:

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

La funcionalidad de un delegado es manejar una lista de punteros de tipo método seguro. Los diseñadores de C# han decidido que no hay nada que agregar a esta funcionalidad y no hay razón para cambiar el comportamiento a los delegados.

Entonces, Jon tiene razón, la herencia no es apropiada aquí.

Los delegados pueden señalar una lista de métodos. Añadimos a esta lista con el operador + = o con Delegate.Combine. Si la firma del método no es nula, se devuelve el resultado del último método invocado (si se recuerda correctamente).

Cuestiones relacionadas