OO-Design

Hallo,

ich habe ein kleines Objektorientiertes Design Problem:

Ich habe drei Klassen:
Ein Interface mit virtuellen Methoden, eine Klasse die von diesem Interface erbt und die Methoden implementiert und noch eine weitere Klasse, die von der zuletzt genannten erbt und die dort implementierten Methoden nutzen soll.

Interface
Header
Code:
class PersistierungsInterface
{
       public:  virtual Link  ChangeAntwortHdl  ( const Link&   neuerAntwortHdl, ArtikelPosition *artP)=0 ;

};

Erbende Klasse
Header:
Code:
class PersistAdapter: public PersistierungsInterface
{
      public :Link  ChangeAntwortHdl  ( const Link&   neuerAntwortHdl, ArtikelPosition *artP);

};

Von der PersistAdapter erbende Klasse
Header

Code:
class PersistAdaptArtikel : public PersistAdapter, public PersistierungsIntArtikel
{
   public :bool  bestandsAnfrage(Link & nAntwortHdl, ArtikelPosition *artP);
   public :Link  ChangeAntwortHdl  ( const Link&   neuerAntwortHdl, ArtikelPosition *artP);
};

Warum kann ich die in der Klasse PersistAdapter implementierten Methoden nicht nutzen und muss sie immer in der Klasse PersistAdaptArtikel Klasse neu implementieren? Ist es immer so, dass jede Klasse in der Vererbungshierachie, die Methoden des Basisinterfaces aufs neue implementieren muss? Diese sind doch schon in der Abgeleiteten Klasse implementiert.
Gibts da eine bessere Lösung?

Viele Grüße aus Hamburg,

Jens
 
Hallo,

deine Denke ist eigentlich richtig. Ich kann aber leider an deinem Code-
Stück nicht erschließen wo dein Fehler liegt...

Folgendes Design würde es tun:

Code:
class A{
    public:
        virtual void foo() = 0;
};

class B : public A{
    public:
        void foo();
};

class C : public B{
};

void B::foo(){
    //doing nothing
}

Gruß

RedWing
 
Moin moin,
wenn ich das richtig verstanden habe, müsste doch jede Klasse die eine Pure virtual Memberfunktion erbt diese auch implementieren. Zugriff auf die Funktion müsste man dann aber kriegen über:
Code:
class A{
    public:
        virtual void foo() = 0;//keine Implementation
};

class B : public A{
    public:
        void foo(){/*mach was sinnvolles*/;}
};

class C : public B{
    public:void foo(){B::foo();}
};

Sollte ich falsch liegen bitte korrigieren:)
Gruss Michael
 
Ich glaube, der Fehler liegt inder Deklaration von 'PersistAdaptArtikel'. Statt
Code:
class PersistAdaptArtikel : public PersistAdapter, public PersistierungsIntArtikel
sollte es heißen
Code:
class PersistAdaptArtikel : public PersistAdapter
In C++ kann man nicht von mehreren Klassen ableiten.
 
CodeFatal hat gesagt.:
Moin moin,
wenn ich das richtig verstanden habe, müsste doch jede Klasse die eine Pure virtual Memberfunktion erbt diese auch implementieren. Zugriff auf die Funktion müsste man dann aber kriegen über:
Code:
class A{
    public:
        virtual void foo() = 0;//keine Implementation
};

class B : public A{
    public:
        void foo(){/*mach was sinnvolles*/;}
};

class C : public B{
    public:void foo(){B::foo();}
};

Sollte ich falsch liegen bitte korrigieren:)
Gruss Michael


Hallo,

normalerweise ist es so wenn B schon foo implementiert braucht dies C nicht
nochmal zu tun, wenn dies nicht erwünscht ist, da ein Objekt vom Typ C auch
autmatisch ein Objekt vom Typ B ist. Also ist das Design des Thread-
erstellers eigentlich richtig....

//edit

In C++ kann man nicht von mehreren Klassen ableiten.
Natürlich geht das. (Siehe Post von CodeFatal)

Gruß

RedWing
 
Zuletzt bearbeitet:
Hmm, ich war mir sicher, daß es das im C++-Standard nicht gibt. Ich habe da im Internet auch etwas von C++-Erweiterungen gelesen. Daß das in Java möglich ist, weiß ich zufällig.
Kann es sein, daß nicht jeder C++-Compiler das macht?
 
Hallo,

also ich verwende den Borland Builder 6 (allerdings ungepacht). Kann sein, dass dies daran liegt. Ich werde jetzt wohl einfach in der zuletzt abgeleiteten Klasse die Methode der zuerst abgeleiteten Klasse aufrufen. Ist zwar nicht schick, aber sonst macht es mir mein ganzes Design kaputt.

Danke für Eure Antworten,

Jens
 
Hallo,

..vielleicht noch als Ergänzung:

Wenn ich die Methode in der zuletzt abgeleiteten Klasse nicht implementiere bekomme ich:
[Linker Fehler] Unresolved external 'PersistAdaptArtikel::ChangeAntwortHdl(const Link&, ArtikelPosition *)' referenced from O:\KUBIS\CLIENT\OBJ.32\PERSIST\ARTKLPO1.OBJ

Entferne ich zusätzlich die Deklaration in dem Header der Klasse gilt diese als Abstrakt.

Viele Grüße aus Hamburg,

Jens
 
Zurück