Sto provando a progettare un gruppo di classi correlate. Ad esempio:
- una classe di tabella contiene un vettore di numero intero e ha una funzione che restituisce numeri interi dal vettore
- un'altra classe di tabella contiene un vettore di doppio e ha una funzione che restituisce i doppi dal vettore
Idealmente mi piacerebbe che le due classi condividessero lo stesso tipo di puntatore e avessero la stessa interfaccia in modo che possano essere costruite e utilizzate in modo simile dal client. L'unica differenza è che una classe dovrebbe restituire un intero e l'altro doppio.
Ho letto alcuni libri sugli schemi di progettazione e comprendo la differenza tra ereditarietà e composizione. Anche se sono ancora un principiante nel design della classe e sospetto che mi sia sfuggito qualcosa di ovvio. Di seguito sono le mie domande:
- È una buona pratica avere membri di dati o membri di funzioni non definiti? Nella seguente codifica di esempio. La classe figlio definirà solo parte dei dati e membro della funzione dalla classe base.
- Idealmente mi piacerebbe avere un'interfaccia comune tra le due classi figlio. tuttavia, poiché la funzione get_value1 di una classe restituisce un intero, l'altro get_value2 di un'altra classe restituisce il doppio, devo assegnare loro un nome di funzione diverso. Questo non è fondamentale, ma può essere evitato?
- Dovrei evitare l'ereditarietà e creare semplicemente due classi diverse? specialmente quando le due classi non condividono la stessa interfaccia utente?
class Base_Table
{
std::vector<int> vec_int_;
std::vector<double> vec_dbl_;
virtual int get_value1(int);
virtual double get_value2(int i);
};
class Int_Table : public Base_Table
{
std::vector<int> vec_int_;
virtual int get_value1(int i) override
{
return vect_int_[i];
}
};
class Frac_Table : public Base_Table
{
std::vector<double> vec_dbl_;
virtual double get_value2(int i) override
{
return vect_int_[i];
}
};