Ich habe eine Klassenstruktur für ein Rollenspiel, das so aussieht ...
%Vor%Grundsätzlich versuche ich, jeden abgeleiteten Typ zu zwingen, eine Eigenschaft "Name" aufzunehmen. Ist das der beste Weg? Ich weiß, dass ich "abstract" aus Item.Name entfernen und dann die überschriebenen "Name" -Eigenschaften in Armor and Helmet entfernen kann. Wenn ich das tue, sieht der Code etwas sauberer aus, aber ich vergesse vielleicht, den base.Name in diesen abgeleiteten Klassen zu setzen.
Könnte mir jemand helfen, mir den besten Weg zu zeigen?
BEARBEITEN: Entschuldige, lass mich meine Frage ein bisschen mehr klären. Ich möchte 2 Dinge sicherstellen. 1) Name-Eigenschaft existiert in allen abgeleiteten Klassen 2) Name-Eigenschaft ist nicht leer oder leer
Ich möchte grundsätzlich jede Klasse, die von Item abgeleitet ist (und nicht abstrakt ist), zwingen, einen Wert für Name zu haben.
Es hört sich so an, als wären Sie besorgt über die Initialisierung von Eigenschaften?
aber ich könnte vergessen, das zu setzen base.Name in diesen abgeleiteten Klassen.
Eine Möglichkeit, die Namenseigenschaft zu erzwingen, besteht darin, diesen Setter wie folgt in Ihren Basisklassenkonstruktor einzufügen:
%Vor%Dann muss alles, was von MyBaseClass abgeleitet wird, diesen Konstruktor erfüllen:
%Vor%Dann können Sie auch die Eigenschaft entweder:
machenIch werde nicht wagen, ob das obige Design gut ist, aber es würde funktionieren, um sicherzustellen, dass alle abgeleiteten Klassen eine gültige Namenseigenschaft haben, wenn sie instanziiert werden.
Ein anderer Ansatz, wie andere Antworten vorschlagen, besteht darin, eine virtuelle Eigenschaft zu implementieren, die in ihrer Basisimplementierung eine Ausnahme auslöst.
Sie müssen nur Name
in der Basisklasse definieren und müssen sie nicht als abstrakt angeben. Es wird weiterhin als Eigenschaft in allen abgeleiteten Klassen verfügbar sein.
Wenn ich das tue, sieht der Code etwas sauberer aus, aber ich könnte vergessen, den base.Name in diesen abgeleiteten Klassen zu setzen.
Dann wird der Name des Objekts nur etwas albern sein.
Besser noch, lassen Sie name
als null
beginnen. Dann erhalten Sie eine Ausnahme, wenn Sie vergessen haben, den Namen zu initialisieren, aber jemand versucht, ihn zu verwenden, und Sie werden wissen, dass Sie ihn beheben müssen.
Mike hat Recht, wenn Sie nur die Eigenschaft "Name" für alle abgeleiteten Objekte verwenden möchten, brauchen Sie sie nicht als abstrakt zu kennzeichnen, da sie vererbt wird.
Wenn Sie nur die Tatsache erzwingen möchten, dass bei der Erstellung von Elementen ein Name eindeutig festgelegt wird, können Sie den Nullparameterkonstruktor ausblenden und einen Konstruktor verfügbar machen, der den Namen akzeptiert.
Sehen Sie sich diesen Code an:
%Vor%Die obigen Definitionen bedeuten Folgendes:
%Vor%Dies erzwingt, dass jede Instanz der Klassen den Namen zum Zeitpunkt der Erstellung definieren muss. Eine mögliche Lösung sowieso ...
Würde Name zu einem virtuellen ie machen. public virtual Name {get; set; }
Accessor in der Klasse Item verwendet werden? Da Helment und Armor von der Item-Klasse abstammen. Es würde erzwingen, dass sie außer Kraft gesetzt werden müssen ...
Hoffe, das hilft, Freundliche Grüße, Tom.
Es hängt also davon ab, was Sie tun möchten ...
Die Klassenzusammenfassung zwingt alle Unterklassen zur Implementierung der Klasse (und ihrer abstrakten Funktionen usw.), aber wenn Sie wollen, dass eine Funktion eine Basisfunktionalität mit der Möglichkeit hat, die Funktion zu überschreiben, dann schlage ich nicht vor die Klasse abstrakt machen und die spezifische Funktion stattdessen virtuell machen, also wenn die virtuelle Funktion nicht überschrieben wird und die Basisfunktion aufgerufen wird.
und es gibt immer Optionen, um "neue" Eigenschaften mit dem gleichen Namen zu erstellen, aber ich denke nicht, dass das eine gute Übung ist.
hoffe das hilft.
Tags und Links c# abstract-class derived-class