2013-03-27 12 views
9

Ho la seguente classe:Non può essere sigillato perché non è un override

namespace Warnings 
{ 
    public abstract class BaseWarningIntField : IWarningInnerDataField 
    { 
     public string PropName; 

     public string HeaderCaption; 

     public sealed WarningInnerDataType DataType 
     { 
      get { return WarningInnerDataType.Integer; } 
     } 
    } 
} 

voglio l'ultima proprietà DataType essere non override, dato che è la classe base per un campo di allarme-dettaglio di tipo Integer , quindi è necessario restituire sempre il tipo corretto WarningInnerDataType.Integer.

In ogni caso, il compilatore mi dà il seguente errore:

'Warnings.BaseWarningIntField.DataType' cannot be sealed because it is not an override

Ma, per quanto ne so il override fa esattamente il contrario di quello che sto cercando di realizzare.

+3

Perché non provare a sovrascrivere quel metodo nella tua implementazione concreta? Potresti ripensare a questa domanda dopo un rapido esperimento. –

+9

Basta non renderlo virual quindi, non è necessario sigillarlo. –

+0

usa alternativamente la lettura statica – Dhawalk

risposta

18

in C# tutti i metodi per impostazione predefinita sono non virtuali. Non è possibile sovrascrivere il metodo non virtuale nelle sottoclassi. Quindi lasciare la proprietà come al solito ti proteggerà dalla sottoclasse ignorandola.

Sealed è una parola chiave utilizzata nella dichiarazione della classe per le restrizioni di ereditarietà o viene utilizzata per arrestare la catena virtuale dei membri di una gerarchia di classi. Ma ancora una volta - questo si riferisce a metodi e proprietà virtuali.

Cercando di ignorare "normale" proprietà in sottoclasse si tradurrà in errore di compilazione

'WarningIntField.DataType.get': cannot override inherited member 'BaseWarningIntField.DataType.get' because it is not marked virtual, abstract, or override

Per rispondere si commento, ti presento alcuni esempi di codice per illustrare il mio punto. In realtà non è possibile limitare le classi derivate dal nascondere un metodo o una proprietà. Così la prossima situazione è legale e non c'è modo per superarla (questo legato al metodo virtuale e metodi indicati con new parola chiave, nonché)

class BaseClass 
{ 
    public string Property {get; set;} 
} 

class DerivedClass : BaseClass 
{ 
    //compiler will give you a hint here, that you are hiding a base class prop 
    public string Property {get; set;} 
} 

Allo stesso modo non è possibile limitare di nascondere un campo in una classe per variabile locale, quindi anche questa situazione è valida. Nota che il compilatore ti aiuterà anche a notare che stai nascondendo un campo classe in una variabile locale. Anche questo si riferiva allo readonlyconst e ai semplici campi static.

int field = 0; //class field 
void Foo() 
{ 
    int field = 0; //local variable 
} 
+4

Da [MSDN] (http://msdn.microsoft.com/en-us/library/88c54tsw (v = vs.110) .aspx): _È inoltre possibile utilizzare il modificatore sealed su un metodo o una proprietà che sovrascrive un virtuale metodo o proprietà in una classe base. Ciò consente di consentire alle classi di derivare dalla classe e impedire loro di ignorare specifici metodi o proprietà virtuali. _ –

+0

@AustinSalonen ringrazia per l'annotazione. Hai dimenticato che puoi bloccare la catena virtuale sigillando. Ma ancora, questo è usato per i metodi virtuali –

+0

Ok, ho capito. Ma c'è un modo per impedire ad altri di nascondere il mio metodo? Attualmente chiunque può fare quella scrittura con lo stesso nome. – Teejay

Problemi correlati