2013-03-27 7 views
9

Mam następujące klasy:nie można zamknąć, bo to nie jest przesłanianie

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

     public string HeaderCaption; 

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

Chcę ostatnią właściwość DataType się nie przeciążać, ponieważ jest to klasa bazowa dla pola ostrzegawczego-detail typu Integer , więc zawsze musi zwracać prawidłowy typ: WarningInnerDataType.Integer.

Zresztą, kompilator daje mi następujący błąd:

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

Ale, o ile wiem, że override robi dokładnie przeciwieństwo tego, co próbuję osiągnąć.

+3

Dlaczego nie spróbować zastąpić tej metody w swojej konkretnej realizacji? Możesz ponownie przemyśleć to pytanie po krótkim eksperymencie. –

+9

Po prostu nie rób tego tak, że nie jest to konieczne, nie musisz go uszczelniać. –

+0

naprzemiennie użyj statycznego tylko do odczytu – Dhawalk

Odpowiedz

18

w C# wszystkie metody domyślnie są nie-wirtualne. Nie można zastąpić metody innej niż wirtualna w podklasach. Opuszczenie nieruchomości w normalny sposób zabezpieczy cię przed podklasą, która go zastąpi.

Sealed jest słowem kluczowym używanym w deklaracji klas dla ograniczeń dziedziczenia lub służy do zatrzymywania wirtualnego łańcucha członków hierarchii klas. Ale znowu - dotyczy to wirtualnych metod i właściwości.

Próbując zastąpić „normalne” właściwość w podklasie spowoduje błąd kompilacji

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

Aby odpowiedzieć na to skomentować, będę przedstawić kilka przykładów kodu, aby zilustrować mój punkt widzenia. W rzeczywistości nie można ograniczyć klas pochodnych przed ukryciem metody lub właściwości. Więc następnym sytuacja jest legalne i nie ma sposobu, aby go pokonać (w tym związane z metodą wirtualną i metod oznaczonego new słów kluczowych, jak również)

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;} 
} 

ten sam sposób nie można ograniczyć ukrywania pola w klasie według zmiennej lokalnej, więc ta sytuacja jest również ważna. Zauważ, że kompilator pomoże Ci zauważyć, że ukrywasz pole klasy w zmiennej lokalnej. Dotyczyło to również pól readonlyconst i prostych static.

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

Od [MSDN] (http://msdn.microsoft.com/en-us/library/88c54tsw (v = vs.110) .aspx): _Można również użyć zapieczętowanego modyfikatora metody lub właściwości zastępującej wirtualny metoda lub właściwość w klasie bazowej. Dzięki temu możesz zezwolić klasom na wyprowadzanie z klasy i zapobiegać nadpisywaniu konkretnych wirtualnych metod lub właściwości. –

+0

@AustinSalonen dzięki za uwagę. Zapomniałem, że można zatrzymać wirtualny łańcuch przez uszczelnienie. Ale znowu, to jest używane dla wirtualnych metod. –

+0

Ok, mam to. Ale czy istnieje sposób blokowania innym ukrywania mojej metody? Obecnie każdy może zrobić to, pisząc jeden o tej samej nazwie. – Teejay

Powiązane problemy