我有以下现有类:

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 充当接口(interface)但没有任何实现。这一切正常。

现在我想创建一个“AdaptedGaussian”类,在计算似然之前,将更改提供给calculated_likelihood的数据 vector 。

一些要求:
  • AdaptedGaussian 必须是 Gaussian 的子类
  • AdaptedGaussian 必须能够“包装”或“成为”每个可能的高斯类的实例
  • AdaptedGaussian 必须从已经存在的 Gaussian 对象构建

  • 我现在的想法是:
    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);
      }
    }
    

    可能有一些缺点:
  • 对于每一个方法(这里有很多),必须在新类
  • 中编写一个虚拟方法
  • 如果 Gaussian 被扩展,而这个类会被遗忘,就会出现令人讨厌的错误。

  • 我这样做是否正确?或者有没有更好的方法来实现这一点?

    是否有一种很好的方法可以将每个未实现的方法标准委托(delegate)给 m_g 的同名方法?

    最佳答案

    看起来不错,我认为这是适配器模式的一个非常经典的实现。只是不要忘记为您的 Gaussian 类声明一个虚拟析构函数。至于缺点。

  • Java 类库处理哑方法问题的方法是创建一个为每个方法提供空实现的哑类。所有不想实现每一个方法的类都可以从这个虚拟类继承并有选择地覆盖他们感兴趣的方法。
  • 如果你用更多的方法扩展你的 Gaussian 类,只要你将它们声明为纯虚方法,无论如何你都会在你的子类文件中得到一个编译器错误。
  • 关于c++ - 在 C++ 中实现复杂的继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1031800/

    10-11 15:50