 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Volz Guest
|
Posted: Wed Sep 10, 2003 10:40 am Post subject: Vererbung? |
|
|
Hi,
ich habe z.B. folgenden Aufbau einer Klasse:
class x
{
private:
int x,y,z;
public:
move ();
rotate ();
shot ();
}
Jetzt habe ich mittlerweile mehrere Klassen die alle diese Variablen und
Funktionen benutzen. Teilweise ist sogar die Implementierung einiger
Funktionen gleich. Jetzt habe ich mir überlegt das durch Vererbung
besser zu designen. Allerdings gibt es eine Ausnahme die kein rotate()
hat. Wie realisiere ich das bei Vererbungen?
Meine Idee wäre es entweder:
- die Funktion leer neu zu implementieren
- irgendwie rotate in eine zweite Klasse zu machen und alle außer dieser
einen von beiden erben zu lassen.
- einen Mechanismus zu nutzen, der es erlaubt eine geerbte Funktion zu
entfernen. (?)
Ich habe hier auch das Buch von Stroustrup liegen, aber ich finde in dem
Walzer nicht das passende Thema dazu. Mir wäre auch geholfen, wenn mich
jemand auf die richtige Stelle im Buch hinweisen könnte. Bin als C
Umsteiger momentan von den Möglichkeiten erschlagen ;-)
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Hans-Christian Ebke Guest
|
Posted: Wed Sep 10, 2003 5:28 pm Post subject: Re: Vererbung? |
|
|
Hi Andreas,
am Mi, 10 Sep 2003 at 10:40 GMT, meinte Andreas Volz:
| Quote: | ich habe z.B. folgenden Aufbau einer Klasse:
class x
{
private:
int x,y,z;
public:
move ();
rotate ();
shot ();
}
Jetzt habe ich mittlerweile mehrere Klassen die alle diese Variablen und
Funktionen benutzen. Teilweise ist sogar die Implementierung einiger
Funktionen gleich. Jetzt habe ich mir überlegt das durch Vererbung
besser zu designen. Allerdings gibt es eine Ausnahme die kein rotate()
hat. Wie realisiere ich das bei Vererbungen?
|
class A {
public:
A();
private:
int x, y, z;
public:
virtual void move();
virtual void shot();
};
class B : public A {
public:
B();
virtual void rotate();
};
Klassen ohne Rotate erben von A, Klassen mit Rotate von B;
Gruß,
Christian
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Ludwig Pumberger Guest
|
Posted: Wed Sep 10, 2003 7:23 pm Post subject: Re: Vererbung? |
|
|
Andreas Volz schrieb:
| Quote: | ich habe z.B. folgenden Aufbau einer Klasse:
class x
{
private:
int x,y,z;
public:
move ();
rotate ();
shot ();
}
Jetzt habe ich mittlerweile mehrere Klassen die alle diese Variablen und
Funktionen benutzen. Teilweise ist sogar die Implementierung einiger
Funktionen gleich. Jetzt habe ich mir überlegt das durch Vererbung
besser zu designen. Allerdings gibt es eine Ausnahme die kein rotate()
hat. Wie realisiere ich das bei Vererbungen?
|
Hm. Ein klassisches Beispiel. Meist mit einer Basisklasse Shape o.ä. Was
heisst eine Klasse hat kein rotate? Lass mich raten: Eine Klasse Circle
vielleicht? Wenn ja: Einen Kreis kannst du rotieren. Wenn du ihn zufällig
um den Mittelpunkt rotierst passiert halt nix.
| Quote: | Meine Idee wäre es entweder:
- die Funktion leer neu zu implementieren
|
Wenn meiner Vermutung stimmt wäre das mathematisch korrekt.
| Quote: | - irgendwie rotate in eine zweite Klasse zu machen und alle außer dieser
einen von beiden erben zu lassen.
|
Naja:
struct Rotateable
{
virtual ~Rotateable(){}
virtual void rotate(const Point &point, double angle) = 0;
};
| Quote: | - einen Mechanismus zu nutzen, der es erlaubt eine geerbte Funktion zu
entfernen. (?)
|
Unmöglich und nicht zielführend. Was soll passieren wenn du die Methode
über Basisklassenzeiger aufrufst?
| Quote: | Ich habe hier auch das Buch von Stroustrup liegen, aber ich finde in dem
Walzer nicht das passende Thema dazu. Mir wäre auch geholfen, wenn mich
jemand auf die richtige Stelle im Buch hinweisen könnte. Bin als C
Umsteiger momentan von den Möglichkeiten erschlagen
|
Irgendwo (ich glaube bei den Containern) diskutiert er Ansätze wie eine
fette Schnittstelle. Ausserdem findet sich auch irgendwo ein Beispiel für
genau so eine Shape Hierarchie.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Werner Salomon Guest
|
Posted: Fri Sep 12, 2003 10:50 am Post subject: Re: Vererbung? |
|
|
Andreas Volz <andreas (AT) brachttal (DOT) net> wrote
| Quote: | ich habe z.B. folgenden Aufbau einer Klasse:
class x
{
private:
int x,y,z;
public:
move ();
rotate ();
shot ();
}
Jetzt habe ich mittlerweile mehrere Klassen die alle diese Variablen und
Funktionen benutzen. Teilweise ist sogar die Implementierung einiger
Funktionen gleich.
|
Hallo Andreas,
welche Implementierungen sind gleich und welche nicht?
| Quote: | Jetzt habe ich mir überlegt das durch Vererbung
besser zu designen.
Wenn Du hier Frage zum Design hast, solltest Du immer die |
Anforderungen beschreiben, die Du an das System stellst. Design folgt
*IMMER* aus den Anforderungen, und nicht weil man etwas immer so oder
anders macht. Insbesondere ist wichtig, wie diese Klassen benutzt
werden sollen.
Hier stellt sich u.a. die Frage, ob die Klassen polymorph sein müssen,
oder ob immer die konkreten Klassen benutzt werden.
| Quote: | Allerdings gibt es eine Ausnahme die kein rotate()
hat. Wie realisiere ich das bei Vererbungen?
|
Ich unterstelle mal (Vermutung!), dass die Methoden move, shot und
rotate wirklich immer dasselbe machen und auf die Variablen x,y,z
(Position ?) zugreifen. Darüber hinaus soll es Klassen mit rotate
geben und welche ohne.
Dann wäre ein gangbarer Weg in etwa dieser:
class noAction {};
template< typename T = noAction >
class MovableShoter : public T {
public:
MovableShoter(); // Member initialisieren
move ();
shot ();
private: // oder protected ?
int x,y,z;
};
class Rotator {
public:
rotate ();
// Member ??
};
Die Idee dahinter ist, eine Klasse zu haben, die move & shot kann und
eine andere die rotate kann. Jede Klasse hat jeweils die Member, die
in den Methoden benötigt werden. Ich unterstelle einfach mal, es gibt
keine Überschneidung! Wenn doch schreib' bitte welche Methode genau
was macht.
Durch den Trick mit dem Template, kann man sich seine konkrete Klasse,
wie gewünscht zusammenbauen. Zum Beispiel:
class x1 : public MovableShoter<> {
};
'x1' kann move & shot, aber nicht rotate
und
class x2 : public MovableShoter< Rotator > {
};
'x2' kann move, shot & rotate
Das ganze würde auch ohne Template und mit Mehrfachvererbung
funktionieren. Ich persönlich versuche letzteres zu vermeiden.
Beachte bitte, dass diese Konstruktion nicht polymorph ist.
Gruß
Werner
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|