Supponiamo di avere una gerarchia di più classi ciascuna derivata l'una dall'altra utilizzando funzioni virtuali. La classe base funge da interfaccia e definisce funzioni, che potrebbero non essere richieste da tutte le classi derivate. Ora mi chiedo quale sia la migliore pratica per tali funzioni intermedie. Dovrebbero essere ancora implementati e collegati in modo semplice alla classe base, o dovrebbero essere saltati? Il problema che ho è che l'implementazione di tale funzione, quando non è necessaria, aggiunge semplicemente rumore al codice. D'altra parte, quando si usa una classe superiore, in C ++ non si può semplicemente chiamare un metodo superclasse (come in Java), quindi è necessario sapere in quale classe base il metodo è realmente implementato. E a mio parere, questo violerebbe l'incapsulamento, perché avrei bisogno di conoscere alcuni dettagli di implementazione della classe base.
Per illustrare cosa intendo, ecco un exmaple artificiale:
class MyInterface
{
virtual void foo(bool) = 0;
virtual void foo1(int) = 0;
};
class Base : public MyInterface
{
void foo(bool param) override
{
// do some stuff here.
}
void foo1(int param) override
{
// do some stuff here.
}
};
class A : Base
{
void foo(bool param) override
{
// do some stuff here.
Base::foo(param);
}
// class doesn't need foo1() here so it is not implemented.
};
class B : A
{
void foo(bool param) override
{
// do some stuff here.
A::foo(param);
}
void foo1(int param) override
{
// This class needs foo1() but as A doesn't have it implemented
// I have to knwo this and skip A going directly to Base
Base::foo1(1);
}
};
Qui la classe B
deve sapere che A non implementa foo1
e deve saltarlo. Naturalmente questo può essere visto nell'intestazione, ma se voglio cambiare in seguito la classe A
non dovrebbe essere necessario toccare tutte le altre classi che ne derivano (principio di incapsulamento e isolamento) Quindi, ancora peggio, se io implementa ora foo1()
in A
più tardi, B
lo salterà comunque e non realizzerà mai che la funzionalità è cambiata.
Quindi dal punto di vista del modello di un oggetto presumo che tali funzioni vuote debbano ancora essere progettate in una classe?