Ostrzeżenie „Użyj nowego słowa kluczowego, jeśli ukrywanie było zamierzone”

101

Na dole ekranu wyświetla się ostrzeżenie:

Ostrzeżenie 1 „WindowsFormsApplication2.EventControlDataSet.Events” ukrywa dziedziczony element członkowski „System.ComponentModel.MarshalByValueComponent.Events”. Użyj nowego słowa kluczowego, jeśli ukrywanie było zamierzone. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Jeśli kliknę dwukrotnie, pojawi się:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

Czy ktoś może mi powiedzieć, jak się tego pozbyć?

tony b
źródło

Odpowiedzi:

145

Twoja klasa ma klasę bazową, a ta klasa bazowa ma również właściwość (która nie jest wirtualna ani abstrakcyjna) o nazwie Events, która jest zastępowana przez Twoją klasę. Jeśli zamierzasz go zastąpić, umieść słowo kluczowe „new” po modyfikatorze public. NA PRZYKŁAD

public new EventsDataTable Events
{
  ..
}

Jeśli nie chcesz go zastępować, zmień nazwę swoich właściwości na inną.

wdavo
źródło
23
Oto link dla każdego, kto chce wiedzieć, jaka jest różnica między nowym a zastąpieniem.
starsplusplus
Słowo new kluczowe pozbyłoby się błędu kompilacji, ale może wprowadzić inne niezamierzone zachowanie. Myślę, że powinieneś dodać ostrzeżenie do swojej odpowiedzi. Byłoby to pomocne w zrozumieniu konsekwencji dodawania new.
ahong
13

@wdavo jest poprawne. To samo dotyczy funkcji.

Jeśli nadpisujesz funkcję podstawową, taką jak Aktualizacja, w swojej podklasie potrzebujesz:

new void Update()
{
  //do stufff
}

Bez nowego na początku dekleracji funkcji otrzymasz flagę ostrzegawczą.

Agresor
źródło
6

W poniższym kodzie Class Aimplementuje interfejs IShowi implementuje jego metodę ShowData. Class Bdziedziczy Class A. Aby skorzystać z ShowDatametody w Class B, musimy użyć słowa kluczowego neww ShowDatametodzie, aby ukryć Class Ametodę klasy bazowej i użyć overridesłowa kluczowego w celu rozszerzenia metody.

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}
Joee
źródło
3
W overridetwoim przykładzie nie ma z twojego wyjaśnienia i overridenie jest potrzebne.
Etienne Faucher
Myślę, że twój przykład jest na dobrej drodze, ale jest niepełny. Twoje wyjaśnienie jest również niejasne. Czy możesz zmienić swoją odpowiedź tak, aby przypominała bardziej dotnetfiddle.net/Iw0OzB ? Jeśli nie, prawdopodobnie opublikuję moje skrzypce jako kolejną odpowiedź
ahong
0

Funkcja nadrzędna potrzebuje virtualsłowa kluczowego, a funkcja potomna potrzebuje overridesłowa kluczowego przed definicją funkcji.

James L.
źródło