微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在虚函数中改变参数/返回类型的子类的工厂模式

如何解决在虚函数中改变参数/返回类型的子类的工厂模式

我想为类编写一个工厂,这些类本质上只是它们处理的消息类型不同,但在其他方面完全相同。我想过写一个子类,让他们继承它有一个共同的祖先。由于孩子必须处理的消息类型不同,我考虑使用模板类作为共同祖先,就像下面的例子一样。

template <typename T>
class Parent 
{
public:
  virtual void Set(T message); 
  virtual T Get();
}

class ChildA : public Parent<MessageType_A>
{
public:
  void Set( MessageType_A message);
  MessageType_A Get(); 
private:
  MessageType_A mMessage;
}

class ChildB : public Parent<MessageType_B>
{
public:
  void Set( MessageType_B message);
  MessageType_B Get(); 
private:
  MessageType_B mMessage;
}

但是,由于父级中的模板,我没有一个通用的基类用于工厂,也想不出解决问题的方法。 我正在考虑使用 std::any、联合或变体,但这些只会给我的问题带来更多障碍,而不是解决它们。 有人知道我如何根据我描述的要求创建工厂吗?

解决方法

Parent 的不同实例是不同的不相关类型。

我考虑过使用模板类作为共同祖先

ChildAChildB 没有共同的祖先。一个继承自 Parent<MessageType_A>,另一个继承自 Parent<MessageType_B>

重新考虑是否可以使所有 ChildX 具有通用接口。举个例子,假设消息是从 istream 中读取并写入到 ostream 中,那么一个通用接口可能如下所示:

struct Common {
    virtual void In(std::istream&) = 0;
    virtual void Out(std::ostream&) = 0;
};

Parent 然后是

template <typename T>
class Parent : public Common
{
public:
  void In(std::istream& in) {
      T t;
      in >> t;
      Set(t);
  }
  void Out(std::ostream& out) {
      out << Get();
  }
protected:
  virtual void Set(T message);
  virtual T Get();
}

现在您可以从不同的 ChildX 继承不同的 Parent<T>,并且它们都有一个共同的祖先 Common

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。