C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Vererbung?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andreas Volz
Guest





PostPosted: Wed Sep 10, 2003 10:40 am    Post subject: Vererbung? Reply with quote



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





PostPosted: Wed Sep 10, 2003 5:28 pm    Post subject: Re: Vererbung? Reply with quote



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





PostPosted: Wed Sep 10, 2003 7:23 pm    Post subject: Re: Vererbung? Reply with quote



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 Wink

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





PostPosted: Fri Sep 12, 2003 10:50 am    Post subject: Re: Vererbung? Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.