2010-06-23 14 views
5

Desidero implementare esplicitamente un metodo di interfaccia su una classe base.Sovrascrivi il metodo di interfaccia implementato in modo esplicito nella classe derivata

Oltre a questo, volevo rendere questo metodo virtuale in modo da poterlo sovrascrivere su una classe derivata, ma i metodi esplicitamente implementati non consentono questo.

Ho provato a fare un metodo virtuale protetto nella base, chiamandolo dal metodo dell'interfaccia e quindi sovrascrivendo questo metodo nella classe derivata. Questo sembra funzionare ma FxCop si lamenta con la regola CA1033 "I metodi di interfaccia dovrebbero essere richiamabili da tipi di figlio".

(La mia classe di base implementa l'interfaccia, la classe derivata non lo fa.)

Come devo migliorare questo codice (abbreviato) per essere più corretti, o dovrei semplicemente ignorare FxCop in questo caso?

nella classe base:

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

#region ISignal Members 

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

#endregion 

nella classe derivata:

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

deciso di implementare i metodi di interfaccia implicitamente, alla fine, che funziona ancora e mantiene FxCop felice.

+0

... e cosa succede quando la classe derivata viene gettato a 'ISignal' e' 'si chiama GetMessage()? – Jay

+0

Sto ancora imparando questa roba :) C'è un modo migliore di farlo? – Andy

+0

Hai veramente bisogno di mischiare implementazioni esplicite e classe base? La soluzione migliore potrebbe essere quella di semplificare il tuo modello. –

risposta

2

Spostare la dichiarazione del metodo ConstructSignal() su una qualche interfaccia (denominarla IConstructSignal) e implementarla nella classe derivata. seguito un'implementazione esplicita funzionerà:

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