Gast
2013-01-29, 14:35:15
Hallo,
gibt es vernünftige Argumente für das erste oder das zweite Szenario? Das erste ist ein sauberes, abstraktes Interface im eigentlichen Sinne... und ohne eigene Implementierung. Mit dem Nachteil das prinzipiell jede Implementierung den gleichen Teil implementieren muss und es richtig machen muss... sonst funktioniert der Kram nicht. Das zweite hat eigene Implementierung mit reingemischt und verschmiert damit die Interface Definition
Oder gibt es noch ein drittes Szenario? Den Implementierungsteil z.B. in eine Implementierung CFoo : public IFoo auszulagern und von CFoo zu erben? Irgendwie begegnen einem immer wieder die einen oder anderen Konstrukte dieser Art und mir ist nie ganz klar, was wann zu bevorzugen ist bzw. die Vorteile sind.
class IFoo {
public:
virtual void process( const B& ptr ) = 0;
virtual void setOutput( IOutput_ptr& p ) = 0;
virtual IOutput_ptr getOutput() = 0;
}
class IFoo {
public:
~IFoo() {};
virtual void process( const B& ptr ) = 0;
virtual void setOutput( IOutput_ptr& p ) {
this->output=p;
};
virtual IOutput_ptr getOutput() {
return this->output;
};
protected:
IOutput_ptr output;
}
btw: Oder brauch ich im ersten Beispiel etwa auch einen virtuellen Destruktur? Auch wenn die Klasse keine eigenen Member hat?
gibt es vernünftige Argumente für das erste oder das zweite Szenario? Das erste ist ein sauberes, abstraktes Interface im eigentlichen Sinne... und ohne eigene Implementierung. Mit dem Nachteil das prinzipiell jede Implementierung den gleichen Teil implementieren muss und es richtig machen muss... sonst funktioniert der Kram nicht. Das zweite hat eigene Implementierung mit reingemischt und verschmiert damit die Interface Definition
Oder gibt es noch ein drittes Szenario? Den Implementierungsteil z.B. in eine Implementierung CFoo : public IFoo auszulagern und von CFoo zu erben? Irgendwie begegnen einem immer wieder die einen oder anderen Konstrukte dieser Art und mir ist nie ganz klar, was wann zu bevorzugen ist bzw. die Vorteile sind.
class IFoo {
public:
virtual void process( const B& ptr ) = 0;
virtual void setOutput( IOutput_ptr& p ) = 0;
virtual IOutput_ptr getOutput() = 0;
}
class IFoo {
public:
~IFoo() {};
virtual void process( const B& ptr ) = 0;
virtual void setOutput( IOutput_ptr& p ) {
this->output=p;
};
virtual IOutput_ptr getOutput() {
return this->output;
};
protected:
IOutput_ptr output;
}
btw: Oder brauch ich im ersten Beispiel etwa auch einen virtuellen Destruktur? Auch wenn die Klasse keine eigenen Member hat?