Laden...

Ist das State Pattern die richtige Wahl?

Erstellt von sonnendeck2000 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.246 Views
S
sonnendeck2000 Themenstarter:in
42 Beiträge seit 2008
vor 15 Jahren
Ist das State Pattern die richtige Wahl?

Hallo,

ich bräuchte einen Rat zur Verwendung des richtigen Design Patterns. Es existieren zwei Klassen A und B, wobei Klasse B von Klasse A erbt und diese um zwei Properties erweitert. Ich möchte gern die beiden Klassen zusammenfassen um somit an anderer Stelle "schöner" arbeiten zu können. Eine Variante wäre in Methoden welche momentan nicht zur Verfügung stehen eine InvalidOperationException zu werfen, wobei mir dieser weg nicht sehr elegant scheint. Mir scheint es auch nicht, das dass State Pattern hier wirklich passt, da in verschiedenen Zuständen verschiedene Methoden zu Verfügung stehen.


public enum State
{
   A, B
}

public class MyClass
{
   private State _state;
   
   public MyClass(State state)
   {
      CurrentState = state;
   }

   public State CurrentState
  { get; set; }

   public void MethodA()
   {
      ...
   }

   public void MethodB()
   {
      if (!(CurrentState  == State.B))
         throw new InvalidOperationException();
      ...
   }
}

D
115 Beiträge seit 2006
vor 15 Jahren

was spricht denn dagegen, die eine Klasse von der anderen Abzuleiten? du kannst doch in den Codeteilen, wo du die gemeinsame Funktionalität verwenden willst ein Objekt der Klasse A gründen und da ein objekt-B rein packen.
Momentan kann ich dein Problem noch nicht genau erkennen. Das andere geht auch, aber wenns nicht notwendig ist braucht man solche Patterns auch nicht verwenden. Es geht ja nicht darum möglichst viele Patterns in die Architektur zu pressen sondern sie da einzusetzen wo sie sinnvoll sind.

S
sonnendeck2000 Themenstarter:in
42 Beiträge seit 2008
vor 15 Jahren

Das Problem ist, dass ich nicht direkt auf diese beiden Klassen zugreife. Es gibt noch zwei weitere Klassen welche ebenfalls voneinander erben und welche ein Objekt der Klasse A bzw. B besitzen.

Klasse X besitzt ein Objekt vom Typ A
Klasse Y erbt von X und initialisiert das Objekt aus A mit einem Objekt aus B.

Im letzteren Fall wird genau das gemacht, was du meinst. Ich benötige jetzt allerdings ein Objekt der Klasse X welches ein Objekt der Klasse B besitzt. Dieses Objekt soll allerdings nicht mit einem Objekt der Klasse Y initialisiert werden.

Ich hoffe das geht so, sieht recht verworren aus was ich da geschrieben habe.

marTin

4.207 Beiträge seit 2003
vor 15 Jahren

ich bräuchte einen Rat zur Verwendung des richtigen Design Patterns. Es existieren zwei Klassen A und B, wobei Klasse B von Klasse A erbt und diese um zwei Properties erweitert. Ich möchte gern die beiden Klassen zusammenfassen um somit an anderer Stelle "schöner" arbeiten zu können. Eine Variante wäre in Methoden welche momentan nicht zur Verfügung stehen eine InvalidOperationException zu werfen, wobei mir dieser weg nicht sehr elegant scheint.

Wenn ich Dich richtig verstanden habe, dann ist Vererbung hier eh fehl am Platz, weil es sich nicht um eine "is a"-Beziehung handelt.

Beschreib doch mal konkreter, was Du genau erreichen willst - dann kann man mal den Ansatz überdenken.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

S
sonnendeck2000 Themenstarter:in
42 Beiträge seit 2008
vor 15 Jahren

Ich habe das Problem jetzt beseitigt. Nach einer kurzen pause und 2 mal tief durchatmen habe ich es mir nochmals angeschaut und gesehen, dass ich etwas am Design änder muss, da es so nicht ideal war. Nach der überarbeitung der Klassen, hatte ich das genannte Problem nicht mehr.

Das nächste Mal Atme ich erst durch und frage dann. Ich danke euch trotzdem für eure Hilfe.

_
227 Beiträge seit 2006
vor 15 Jahren

Wenn du uns jetzt noch kurz erläuterst was du vor hattest und wie du es davor/jetzt machen willtst dann lernen sicher viele auch noch was dazu 😁

S
sonnendeck2000 Themenstarter:in
42 Beiträge seit 2008
vor 15 Jahren

Da hast du Recht und ich hatte es auch vor. Im Moment habe ich leider nicht die Zeit es zu schreiben, daher werde ich es später machen.

S
sonnendeck2000 Themenstarter:in
42 Beiträge seit 2008
vor 15 Jahren

Wie versprochen, kommt hier die Antwort. Ich habe die kryptischen Klassennamen durch verständlichere ersetzt.

Ein UML Diagramm des Beispiels befindet sich im Anhang. Es gibt die 4 Klassen: *Groesse *HosenGroesse (abgeleitet von Größe) *Kleidung (mit Membervariable _groesse) *Hose (abgeleitet von Kleidung)

Ein Objekt der Klasse Kleidung erstellte immer ein Objekt der Klasse Groesse und ein Objekt der Klasse Hose, erstellte eins der Klasse HosenGroesse. An einer Stelle benötige ich ein Objekt der Klasse Kleidung (welches nicht mit Hose initialisiert werden darf), welches ein Objekt der Klasse HosenGroesse besitzt.

Nach dem ich mir meine Klassen nochmal genauer angeschaut hatte, konnte ich die Klasse Hose Streichen. Der Klasse Kleidung wird jetzt durch eine Enumeration die Art der Kleidung übergeben.

Nochmal danke für die Hilfe.