2010-06-23 17 views
5

Quiero implementar explícitamente un método de interfaz en una clase base.Invalidar el método de interfaz implementado explícitamente en la clase derivada

Más allá de esto, quería que este método fuera virtual para poder anularlo en una clase derivada, pero los métodos implementados explícitamente no lo permiten.

He intentado hacer un método virtual protegido en la base, llamándolo desde el método de interfaz, y luego anulando este método en la clase derivada. Esto parece funcionar, pero FxCop se queja de la regla CA1033 "Los métodos de interfaz deben poder llamarse por tipos secundarios".

(Mi clase base implementa la interfaz, la clase derivada no lo hace.)

¿Cómo debería mejorar este código (abreviado) para ser más correctos, o debería ignorar FxCop en este caso?

En la clase base:

protected virtual string ConstructSignal() 
{ 
    return "Base string"; 
} 

#region ISignal Members 

string ISignal.GetMessage() 
{ 
    this.ConstructSignal(); 
} 

#endregion 

En la clase derivada:

protected override string ConstructSignal() 
{ 
    return "Derived string"; 
} 

Decidió poner en práctica los métodos de la interfaz de forma implícita al final, que todavía funciona y mantiene FxCop feliz.

+0

... y lo que sucede cuando la clase derivada se echó a 'ISignal' y' 'GetMessage se llama()? – Jay

+0

Todavía estoy aprendiendo esto :) ¿Hay alguna forma mejor de hacerlo? – Andy

+0

¿Realmente necesita mezclar implementaciones explícitas y clase base? La mejor solución podría ser simplificar su modelo. –

Respuesta

2

Mueva la declaración del método ConstructSignal() a alguna interfaz (asígnele el nombre IConstructSignal) e impleméntela en la clase derivada. Después de la implementación explícita funcionará:

string ISignal.GetMessage() 
{ 
    (this as IConstructSignal).ConstructSignal(); // implementation of derived class called 
} 
Cuestiones relacionadas