Wie gehe ich vor, wenn ich die Basis eines Objekts mit einem vorhandenen Objekt initialisieren muss? Zum Beispiel in diesem Szenario:
%Vor%Assign () -Methode kann natürlich der Basisklasse Feld für Feld Werte zuweisen, aber gibt es keine bessere Lösung? Da Klasse B von A erbt, muss es möglich sein, A nur der B.base
zuzuweisenIn C ++ wäre das eine triviale Sache, aber ich kann nicht verstehen, wie man das in .NET macht.
Leider ist base
schreibgeschützt.
[Bearbeiten]
Nun, vielleicht nicht so unglücklich. Die Beziehung zwischen einer Basisklasse und einer Kindklasse ist IS-A
nicht HAS-A
. Indem Sie einer untergeordneten Klasse erlauben, die Instanz der Basisklasse zu ändern, erlauben Sie der untergeordneten Klasse, ihre eigene Referenz zu ändern, da sie IS-A
Basisklasse hat. Wenn Sie diese Funktionalität wirklich benötigen, würde ich vorschlagen, dass Sie Ihr Vererbungsmodell so ändern, dass es das widerspiegelt, was Sie wirklich tun möchten.
In etwa so:
%Vor%scheint angemessener und hat eine klarere Bedeutung und Funktionalität.
Im Grunde verwendet es die Reflektion, um alle Eigenschaften der Basis zu erhalten und die Werte für alle Werte, die in A existieren, zuzuordnen.
BEARBEITEN: An alle Neinsager, die da draußen waren, habe ich das jetzt schnell mit einer Basisklasse getestet, die 100 ganzzahlige Variablen hatte. Ich hatte dann diese Methode in einer Unterklasse zuweisen. Es dauerte 46 Millisekunden, um zu laufen. Ich weiß nicht wie es dir geht, aber mir geht es vollkommen gut.
Obwohl es hier viele ausgezeichnete Antworten gibt, denke ich, dass der richtige Weg dies ist, indem man die Konstruktoren verkettet:
%Vor%Nein, die Syntax, die Sie versuchen, ist in C # .NET nicht möglich.
%Vor%Ist die Absicht, dass diese Felder einmal während der Objektkonstruktion initialisiert werden, oder könnte "Zuweisen" während der Lebensdauer eines Objekts mehrmals aufgerufen werden? Wenn Letzteres, können Sie den Rest davon ignorieren:)
Andrews Unterscheidung zwischen IS-A und HAS-A ist eine wichtige; Wenn die Beziehung wirklich ein HAS-A ist, ist seine Kompositionslösung der richtige Weg.
Wenn eine IS-A-Beziehung sinnvoller ist (und Sie A modifizieren können), könnte ein Kopierkonstruktor eine gute Idee sein:
%Vor%Sie müssen schließlich jede der Eigenschaften von A kopieren, aber die Verantwortung dafür liegt in A, wo sie hingehört.
Falsche Frage. Sie missbrauchen hier offensichtlich die Erbschaft. Versuchen Sie, es zu refaktorieren, damit Sie einen Verweis auf A als ein Mitgliedsfeld behalten. Wenn Sie Polymorphie benötigen, sollten Sie eine gemeinsame Basisklasse oder noch besser - eine Schnittstelle - verwenden.
Laut MSDN kann "base" nur für die folgenden Operationen verwendet werden: