Initialisiere die Basisklasse in .NET

7

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

zuzuweisen

In C ++ wäre das eine triviale Sache, aber ich kann nicht verstehen, wie man das in .NET macht.

    
galets 29.01.2009, 18:41
quelle

10 Antworten

17

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.

    
Andrew Hare 29.01.2009, 18:45
quelle
9
%Vor%

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.

    
BFree 29.01.2009 18:45
quelle
5

Obwohl es hier viele ausgezeichnete Antworten gibt, denke ich, dass der richtige Weg dies ist, indem man die Konstruktoren verkettet:

%Vor%     
Tamas Czinege 29.01.2009 19:04
quelle
4

Nein, die Syntax, die Sie versuchen, ist in C # .NET nicht möglich.

%Vor%     
Nick Berardi 29.01.2009 18:44
quelle
3

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.

    
John Price 29.01.2009 20:33
quelle
1

Warum sollten Sie? Durch das Deklarieren eines neuen B ruft die CLR automatisch die Konstruktoren für beide Klassen auf.

%Vor%

B neu hat die Felder beider Klassen. Sie sollten sie jedoch mit einem Initialisierer deklarieren, wenn Sie Nullen mögen:

%Vor%     
tsilb 29.01.2009 18:46
quelle
1

Ich hoffe, ich bin nicht der Einzige, der denkt, dass das Austauschen Ihrer Basisklasse ein schlechtes Designmuster ist. Ein anderer Ansatz besteht darin, die Vererbung durch Komposition zu ersetzen:

%Vor%

Nun ist es trivial, so etwas zu schreiben:

%Vor%     
Juliet 29.01.2009 19:09
quelle
1

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.

    
Krzysztof Kozmic 29.01.2009 19:53
quelle
0

Laut MSDN kann "base" nur für die folgenden Operationen verwendet werden:

  • Ruft eine Methode für die Basisklasse auf, die von einer anderen Methode überschrieben wurde.
  • Geben Sie an, welcher Basisklassenkonstruktor beim Erstellen von Instanzen der abgeleiteten Klasse aufgerufen werden soll.
Sebastian Dietz 29.01.2009 18:46
quelle
0
%Vor%     
aistrong 30.07.2014 09:15
quelle

Tags und Links