如何解决在虚函数中改变参数/返回类型的子类的工厂模式
我想为类编写一个工厂,这些类本质上只是它们处理的消息类型不同,但在其他方面完全相同。我想过写一个子类,让他们继承它有一个共同的祖先。由于孩子必须处理的消息类型不同,我考虑使用模板类作为共同祖先,就像下面的例子一样。
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
的不同实例是不同的不相关类型。
我考虑过使用模板类作为共同祖先
ChildA
和 ChildB
没有共同的祖先。一个继承自 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 举报,一经查实,本站将立刻删除。