Erzwingen einer abgeleiteten Klasse zum Einschließen bestimmter Eigenschaften mit dem Standardwert

8

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.

    
mikedev 28.01.2010, 21:19
quelle

7 Antworten

9

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:

machen
  • abstract, um sicherzustellen, dass es in jeder abgeleiteten Klasse mit einer eigenen Implementierung existiert
  • virtual, um eine Basisimplementierung bereitzustellen und alles, was überschrieben werden soll.

Ich 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.

    
David Hall 28.01.2010, 21:38
quelle
4

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.

%Vor%     
Karmic Coder 28.01.2010 21:22
quelle
2
  

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.

    
Anon. 28.01.2010 21:25
quelle
2

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 ...

    
KP. 28.01.2010 21:27
quelle
0

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.

    
t0mm13b 28.01.2010 21:26
quelle
0

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.

    
aggietech 28.01.2010 21:40
quelle
0

Ich denke, Sie können die Eigenschaft in einer abstrakten Klasse immer noch virtuell machen, also sollte das Ihr Problem lösen.

Sie können den Wert auf einen bestimmten Wert in der abstrakten Basisklasse festlegen. hier ein Beispiel:

%Vor%     
aggietech 28.01.2010 23:00
quelle