Allgemeine Klasse -> Spezielle Klasse
-
Hallo,
ich möchte fragen ob folgendes realisierbar ist; Ich möchte eine allgemeine Klasse haben. Erst wenn die Klasse durch den Konstruktor aufgerufen wird, wird anhand der Parameter entschieden um "welches Objekt" es sich wirklich handelt.
Z.B. habe ich eine Klasse "Allgemein" eine Klasse "SpeziellInt" und eine Klasse "SpeziellDouble"
Die Instanzierung einer Klasse "SpeziellInt" würde dann z.B. durch Allgemein(5) passieren. Die Instanzierung einer Klasse "SpeziellDouble" entsprechend durch einen double Parameter.
Die beiden speziellen Klassen haben Gleichnamige Methoden, jedoch mit verschiedenem Inhalt. Diese Methoden sollten jedoch auch von der allgemeinen Klasse aus aufgerufen werden können.
Z.B.
Allgemein a = new Allgemein(5); // Der Konstruktor entscheidet anhand des Parameters, dass das Objekt keine Instanz der Klasse "Allgemein" sonder "SpeziellInt" ist MessageBox.Show(a.ToString());
Eine pfuschige Möglichkeit ist es, per enum in der Klasse "Allgemein" abzuspeichern "wie die Klasse zu interpretieren ist". Nun könnte in der ToString Methode der enum wieder abgefragt werden und somit entschieden werden welcher String zurückgegeben wird. Somit würd es die speziellen Klassen garnicht geben sondern nur die Klasse "Allgemein" mit einer int UND einer double Variable. Wiederrum der enum würde entscheiden ob es sich um eine Int- oder eine Double Klasse handelt. Ich höffe, dass es auch eine saubere "offizielle" Version meines Vorhabens gibt.
Vielen Dank schonmal für eure Unterstützung.
Daniel
-
Was willst du denn genau machen? Eine Möglichkeit wäre eine Fabrik zu verwenden, also vllt:
class SpeziellFabrik { public SpeziellInt Create(int val) { return new SpeziellInt(val); } public SpeziellFloat Create(float val) { return new SpeziellFloat (val); } }
-
"Allgemeine Klasse" -> Interface
"Spezielle Klasse" -> Implementierung
Konstruktor der "allgemeinen Klasse" -> Factory
-
-
Jop, ich denke genau das habe ich gesucht.
Vielen Dank an Euch!
@ witte: Ein Matheprogramm mit dem man z.B. Gleichungen umstellen oder ableiten kann.
Die Klasse Allgemein bekommt den Namen "Ausdruck" der nichts Anderes darstellt als eine Klasse "Summe", "Quotient", "Sinus",...
-
Was spricht denn gegen
Allgemein a = new SpeziellInt(5);
?
Wenn du die Methoden der allgemeinen Klasse virtual machst und die gleichnamigen Methoden der speziellen Klassen mit override deklarierst, funktioniert das auch, dass die speziellen Methoden aufgerufen werden:class Allgemein { //... public virtual void Methode() { } //... } class Speziell : Allgemein { //... public override void Methode() { } //... } // In der Main: Allgemein a = new Speziell(); a.Methode(); // Es wird Speziell.Methode() aufgerufen
Unter Umständen sollten die Klasse AAllgemein und die Methode dort abstract gemacht werden:
abstract class Allgemein { //... public abstract void Methode(); // Keine eigene Implementierung //... }
-
Spricht nichts gegen. Funktioniert
Danke!
-
Wenn die Methoden eh keine Implementierungen anbieten sollen, dann reicht auch ein Interface.