Podczas refaktoryzacji stworzyłem metodę taką jak na poniższym przykładzie. Typ danych został zmieniony ze względu na prostotę.
Wcześniej miałem takie oświadczenie przydziału:
MyObject myVar = new MyObject();
Zostało to refaktoryzowane przez przypadek:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Było to wynikiem mojego błędu wycinania / wklejania, ale new
słowo kluczowe w private static new
jest prawidłowe i się kompiluje.
Pytanie : Co oznacza new
słowo kluczowe w sygnaturze metody? Zakładam, że to coś, co zostało wprowadzone w C # 3.0?
Czym to się różni override
?
new
jako modyfikatora aa w metodzie (lub innym elemencie członkowskim typu) nie jest „czymś wprowadzonym w języku C # 3.0”. Jest tam od pierwszej wersji C #.Odpowiedzi:
Nowe odniesienie do słów kluczowych z MSDN:
Dokumentacja MSDN
Oto przykład, który znalazłem w sieci od MVP firmy Microsoft, który miał sens: Link do oryginału
Zastąpienia można używać tylko w bardzo szczególnych przypadkach. Z MSDN:
Zatem słowo kluczowe „new” jest potrzebne, aby umożliwić „przesłonięcie” metod niewirtualnych i statycznych.
źródło
new
chodzi, ale myślę, że jest to dosłownie tylko dla czytelności - kompilator po prostu ostrzega, że kiedy wywołujesz metodę klasy pochodnej o tej samej nazwie co baza, nie otrzymasz metody klasy bazowej, którą możesz myślę ... to dziwne ... wyłącznie dla czytelności?IMyInterface
zostanie wywołana implementacja w klasie pochodnej. W ten sposóbIMyInterface c = new B()
zadzwoni implementacja klasy B. Jeśli tylko jedna klasa implementuje interfejs, zostanie wywołana metoda z klasy, która go implementuje.Nie, to właściwie nie jest „nowe” (przepraszam za kalambur). Zasadniczo jest używany do „ukrywania” metody. TO ZNACZY:
Jeśli to zrobisz:
Metoda w Base to ta, która zostanie wywołana, a NIE ta w wyprowadzonej.
Więcej informacji: http://www.akadia.com/services/dotnet_polymorphism.html
Re twoja edycja: W podanym przeze mnie przykładzie, gdybyś miał "przesłonić" zamiast używać "nowy", a następnie wywołać b.Method (); Metoda klasy pochodnej zostanie nazwana z powodu polimorfizmu.
źródło
Jak wyjaśnili inni, służy do ukrycia istniejącej metody. Jest to przydatne do przesłonięcia metody, która nie jest wirtualna w klasie nadrzędnej.
Pamiętaj, że tworzenie „nowego” elementu nie jest polimorficzne. Jeśli rzutujesz obiekt na typ podstawowy, nie będzie on używał elementu członkowskiego typu pochodnego.
Jeśli masz klasę bazową:
A następnie klasa pochodna:
Jeśli zadeklarujesz typ,
DerivedType
a następnie go wyrzucisz, metodaDoSomething()
nie jest polimorficzna, wywoła metodę klasy bazowej, a nie pochodną.źródło
override
w metodzie sygnaturynew
ukrywa typ podstawowy przed typem pochodnym, ponieważ nie możesz zawsze uzyskać dostępu do typu podstawowego za pomocąbase.<type>
notacji?base.<method>
, a także zewnętrznie, jeśli rzutujesz na typ podstawowy w kodzie. Technicznie dokładniej jest myśleć o tym jako o „nadpisywaniu” metody podstawowej niż o „ukrywaniu” jej.Z dokumentów:
Jeśli metoda w klasie pochodnej jest poprzedzona słowem kluczowym new, metoda jest definiowana jako niezależna od metody w klasie bazowej.
Co to oznacza w praktyce:
Jeśli dziedziczysz z innej klasy i masz metodę, która ma ten sam podpis, możesz zdefiniować ją jako „nową”, aby była niezależna od klasy nadrzędnej. Oznacza to, że jeśli masz odwołanie do klasy „nadrzędnej”, to ta implementacja zostanie wykonana, jeśli masz odwołanie do klasy podrzędnej, to ta implementacja zostanie wykonana.
Osobiście staram się unikać słowa kluczowego „nowe”, ponieważ zwykle oznacza to, że mam błędną hierarchię klas, ale czasami może się to przydać. Jedno miejsce służy do wersjonowania i kompatybilności wstecznej.
W witrynie MSDN jest wiele informacji na ten temat .
źródło
new
byciem tam. To jest składnia / czytelność.Oznacza to, że metoda zastępuje metodę o tej samej nazwie odziedziczonej przez klasę bazową. W twoim przypadku prawdopodobnie nie masz metody o tej nazwie w klasie bazowej, co oznacza, że nowe słowo kluczowe jest całkowicie zbędne.
źródło
Krótko mówiąc - NIE jest to wymagane, NIE zmienia zachowania i jest CAŁKOWICIE tam dla czytelności.
Dlatego w VS zobaczysz trochę zawijanie, ale twój kod będzie kompilował się i działał idealnie dobrze i zgodnie z oczekiwaniami.
Można się zastanawiać, czy naprawdę warto było stworzyć
new
słowo kluczowe, skoro wszystko to oznacza, że programista przyznał: „Tak, wiem, że ukrywam metodę podstawową, tak wiem, że nie robię nic związanego zvirtual
luboverriden
(polimorfizm) - Naprawdę chcę po prostu stworzyć własną metodę ”.Jest to dla mnie trochę dziwne, ale może tylko dlatego, że pochodzę z
Java
tła i istnieje podstawowa różnica międzyC#
dziedziczeniem aJava
: WJava
metodach są domyślnie wirtualne, chyba że określono to wfinal
. W programieC#
metody są domyślnie końcowe / konkretne, chyba że określono to wvirtual
.źródło
Z MSDN :
źródło
Uważaj na tę łapkę.
Masz metodę zdefiniowaną w interfejsie, który jest zaimplementowany w klasie bazowej. Następnie tworzysz klasę pochodną, która ukrywa metodę interfejsu, ale nie deklarujesz konkretnie klasy pochodnej jako implementującej interfejs. Jeśli następnie wywołasz metodę za pośrednictwem odwołania do interfejsu, zostanie wywołana metoda klasy bazowej. Jeśli jednak klasa pochodna konkretnie implementuje interfejs, jej metoda zostanie wywołana niezależnie od używanego typu odwołania.
źródło