2008-12-04 5 views

Antwort

12

"neu" bedeutet, dass Sie zwei völlig verschiedene Methoden haben, was die CLR betrifft - sie haben zufällig denselben Namen, aber sie sind in Bezug auf die Vererbung nicht verwandt. Das bedeutet, wenn Sie:

Base b = new Derived(); 
Derived d = new Derived(); 
b.MyMethod(); // Calls Base.MyMethod 
d.MyMethod(); // Calls Derived.MyMethod 

Dies kann für einige sehr schwer zu verstehen Code machen.

Normalerweise, wenn Sie verschiedene Methoden möchten, rufen Sie sie verschiedene Dinge. Der normale Grund, denselben Namen (und dieselbe Signatur) zu verwenden, besteht darin, das Verhalten der Methode einer Basisklasse zu überschreiben. An diesem Punkt haben Sie keine andere Wahl, als den Namen/die Signatur gleich zu halten.

3

Ich versuche immer noch herauszufinden, was der Anwendungsfall für "neu" ist, abgesehen von schrecklichen Hackereien.

+0

Da ist * IS * kein Usecase, es ist * eine andere * Methode, die zufällig den gleichen Namen hat, Zeitraum ... –

+3

Der Anwendungsfall ist ziemlich einfach, tatsächlich. Die Schritte sind: 1) Sie stammen von einer Klasse, die nicht unter Ihrer Kontrolle steht (z. B. eine aus dem Framework). 2) Sie führen eine neue Methode namens Foo() ein. 3) Eine neuere Version der Basisklasse führt auch Foo() ein. 4) Sie erhalten eine Compiler-Warnung und beheben sie. –

+3

Die Optionen zum Reparieren sind: a) Benennen Sie die Methode um (nicht immer möglich). b) Fügen Sie den Modifikator "new" hinzu. Und ja, das ist eine unangenehme Situation, die Sie wo immer möglich vermeiden sollten - aber es ist schön, dass Sie mit C# zumindest fertig werden. –

0

Dies ist eigentlich nicht ein Wahl Sie haben. Dies wird Ihnen jedoch auferlegt, indem Sie die Basisklasse erstellen. Wenn es eine Methode mit dem gleichen Namen gibt und diese als "virtual" markiert ist, solltest du override verwenden, außer du möchtest einige ernsthaft lustige Fehler auftauchen lassen, wenn Leute anfangen, Objekte deiner Klasse in die Basisklasse zu werfen ...

Wenn diese Methode jedoch NICHT als "virtuell" gekennzeichnet ist, kann die neue Methode nur mit dem Schlüsselwort "new" erstellt werden. Beachten Sie jedoch, dass dies keine Methodenaufrufe ersetzt, bei denen der Verweis von typeof (Basisklasse) auf Ihre Methode verweist. Also ist das meistens nur syntaktischer Zucker, um eine neue Methode mit dem gleichen Namen und der gleichen Signatur zu erstellen ...

Obwohl wenn Code auf dein Eisen trifft ist es nichts anderes als eine völlig andere Methode mit dem gleichen Namen und der gleichen Signatur. Wo eine überschriebene Methode wird -Ihre neue Methode jeden einzelnen Anruf einschließlich der in der Basisklasse Montage ersetzen ...

So sie zu vergleichen ist wie Autos zu vergleichen und ERRH ... Vögel oder etwas ..

Verwandte Themen