Klassendesign - brauche Hilfe
-
Hallo,
ich habe folgendes vor:
Eine abstrakte Oberklasse C soll zwei abgeleitete Unterklassen c1 und c2 haben. Die abstrakte Oberklasse soll Methoden update und compute zur Verffügung stellen, die von c1 und c2 implementier werden. Soweit so schön. Nun haben aber diese Methoden abhängig von c1 und c2 verschiedene Eingabetypen. c1 realisiert das ganze für ganze Zahlen und hat deshalb den Eingabetyp int. c2 hingegen arbeitet mit Vektoren und hat dehalb den Eingabetyp vector<double>. Wie realisiere ich das ganze nun am vernünftigsten?
Ein erster Vorschlag wäre, das C einen eigenen Eingabetyp definiert, der dann von c1 und c2 überschrieben wird:
class C { typedef int input_type; public: virtual void update (input_type n); } class c1 { typedef int input_type; public: virtual void update (input_type n); } class c2 { typedef vector<double> input_type; public: virtual void update (input_type n); }
Geht sowas? Ist das auch sinnvoll? Wie könnte man es anders lösen? Fragen über Fragen, vielleicht kann der ein oder andere ein paar gute Vorschläge machen. Vielen Dank schonmal,
LIBS
-
Gib doch einfach der Masterklasse gar keinen Parameter ( update(void) )
und überschreibe und überlade ihn dann in der Unterklasseupdate(void) {
cout << "Ich will ne int";
}update(int x) {
sonstwas = x;
}
-
Für so was würde ich Templates verwenden.
-
Gast221212 schrieb:
Gib doch einfach der Masterklasse gar keinen Parameter ( update(void) )
und überschreibe und überlade ihn dann in der Unterklasseupdate(void) {
cout << "Ich will ne int";
}update(int x) {
sonstwas = x;
}Dann gibt's keinen Grund
- in die Basisklasse eine solche Methode aufzunehmen
- von dieser Klasse abzuleiten ?@libs: Bist du sicher, dass es sich bei deiner Vererbung um eine ist-ein-Beziehung handelt?
-
Optimizer schrieb:
@libs: Bist du sicher, dass es sich bei deiner Vererbung um eine ist-ein-Beziehung handelt?
Eigentlich schon:
Oberklasse: Wahrscheinlichkeitsdichte
Unterklassen: Diskrete bzw. Multivariate Dichte. Brauchen halt verschiedene Eingaben.
-
Wie wärs damit:
template<typename T> class C { public: virtual void update (T n); };
und dann einfach
C<int> obj1; C<vector<double> > obj2;
Mfg, smasher1985
-
1. Loesung: templates
Damit kannst solchen "Schmutz" ohne probleme hinzaubern2. wenn du das unbedingt in eine IST-EINE Abhaengigkeit reinpressen musst, musst deinen EIngabeParameter generalisieren ....
Sprich eine Klasse INputParamater(abstract) bauen, der in mehreren definierten auspraegungen existiert und dir int double und listen von double werten entgegennehmen kann. (musst dan checken, ob dein input parameter auch deinen anforderungen entspricht ....3. "Erzaehl es ja keinem weiter" ... oder eben die C-Loesung:
uebergib nen void * und verlass dich drauf, das es dass ist, was du brauchst ... MEGA SCHMUTZ unter c++ !In deinem konkreten fall wuerd ich die Ist-Eine Beziehung nochmal ueberdenken ...
Wahrscheinlichkeitsdichte / Diskrete bzw. Multivariate Dichte
gemeinsamkeiten:
haben ein ergebnis (selber Typ ??)
Brechnen irgendwasUnterschiede:
Berechnungsmethode
EingabeparameterSieht mir echt ned vorteilhaft nach ner IST_EINE beziehung aus ....
Und nun noch nen Merksatz (glaube aus modern c++ oder war es exceptional c++ ... sorry bin schlecht im zitieren ...Asche auf mein haupt)
Vererbe nie um Code wiederzuverwenden, vererbe nur, um wiederverwendet zu werden.
Sprich, vererbung nur, wenn du 2 objecte unterschiedlichen typs in bestimmten Situationen gleich behandeln musst.
Haufigster Anwendungsfall, du musst die teile in nen gemeinsamen container pappen,
2. haeufigster: Objectfabriken, du musst die objecte generisch aus irgendwelchen vorlagen erzeugen ....Das andere geht meist ohne vererbung
Ciao ....
-
Vererbt wird in diesem Fall eigentlich nicht viel. Die Oberklasse (Density) ist rein abstrakt, und dient nur als Schnittstelle nach aussen. Wenn man dann Statistische Lernverfahren (NN ... ) hat, sollen diese einfach ein Objekt vom Typ Density erhalten und damit losrechnen. Egal was Density nun für eine Dichte ist. Vielleicht klappt es aber so nicht, dann muss ich es halt alles in je 2 Versionen trennen
-
RHBaum schrieb:
Und nun noch nen Merksatz (glaube aus modern c++ oder war es exceptional c++ ... sorry bin schlecht im zitieren ...Asche auf mein haupt)
Vererbe nie um Code wiederzuverwenden, vererbe nur, um wiederverwendet zu werden.
Ist glaube ich Stroustrup
-
Warum ist 'update' bestandteil der Oberklasse? In einem Kontekt, in dem ich nur weiß, dass sich um ein Objekt des Typs 'C' handelt kann ich 'update' unmöglich aufrufen, da ich nicht weiß, ob ich einen einzelnen Wert oder mehrere übergeben muss.
Daraus folgt, dass Zwar jedes Derivat eine Methode namens 'update' besitzt (mit verschiedener Signatur, der Name ist natürlich auch nicht mehr zwingend), nicht aber die Basis.Gibt es denn überhaupt etwas, was "Diskrete" und "Multivariate Dichte" gemeinsam haben (ich meine jtzt an Schnittstelle)? sonst wäre ein gänzlich anderer Ansatz möglicherwise deutlich besser.
Wenn es beispielsiwese nur diese Beiden gibt und die auch komplett verschieden Behandelt werden, könnte man auf sowas, wie boost::variant zurückgreifen.