У меня есть следующие существующие классы:
class Gaussian {
public:
virtual Vector get_mean() = 0;
virtual Matrix get_covariance() = 0;
virtual double calculate_likelihood(Vector &data) = 0;
};
class Diagonal_Gaussian : public Gaussian {
public:
virtual Vector get_mean();
virtual Matrix get_covariance();
virtual double calculate_likelihood(Vector &data);
private:
Vector m_mean;
Vector m_covariance;
};
class FullCov_Gaussian : public Gaussian {
public:
virtual Vector get_mean();
virtual Matrix get_covariance();
virtual double calculate_likelihood(Vector &data);
private:
Vector m_mean;
Matrix m_covariance;
};
Как видите, класс Gaussian действует как интерфейс, но не имеет никакой реализации. Это все работает нормально.
Теперь я хочу создать класс «AdaptedGaussian», в котором вектор данных, предоставленный для selected_likelihood, будет изменен до вычисления вероятности.
Некоторые требования:
- AdaptedGaussian должен быть дочерним классом Gaussian
- AdaptedGaussian должен уметь «оборачивать» или «быть экземпляром» каждого возможного гауссовского класса
- AdaptedGaussian должен быть построен из уже существующего гауссовского объекта
Идея, которую я имею сейчас:
class Adapted_Gaussian : public Gaussian {
private:
Gaussian* m_g;
public:
virtual Vector get_mean() { return m_g->get_mean(); }
virtual Matrix get_covariance() { return m_g->get_covariance(); }
virtual double calculate_likelihood(Vector &data)
{
//do something with data
return g->calculate_likelihood(Vector &data);
}
}
Возможно, есть некоторые недостатки:
- Для каждого метода (а их здесь больше, чем показано), в новый класс должен быть записан фиктивный метод
- Если Гауссиан когда-либо расширяется, и этот класс будет забыт, могут появиться неприятные ошибки.
Я делаю это правильно? Или есть лучшие методы для реализации этого?
Может быть, есть хороший способ стандартизировать делегирование каждого не реализованного метода одноименному методу m_g?