我想使用不同的协议创建用于序列化的小型库。所以,我创建了“ interface ”(小抽象类) Serializable - 每个实现它的类都可以被序列化:
class Serializable // interface
{
public:
std::string Serialize(Encoder & encoder) const
{
return DoSerialize(encoder);
}
private:
virtual std::string DoSerialize(Encoder & encoder) const = 0 {}
};
另一方面,我有各种编码器的抽象版本(针对不同的编码):
class Encoder
{
public:
Serialized GetEncoded()
{
return DoGetEncoded();
}
void Encode(const std::string & data)
{
DoEncode(data);
}
... other encoding functions
private:
virtual Serialized DoGetEncoded() = 0 {}
virtual void DoEncode(const std::string & data) = 0 {}
};
我用它像:
Test1 test;
test.test = "abc";
SomeEncoder enc;
cout << "Test::Serialize: " << test.Serialize(enc) << endl;
但也许不是这种方法,在编码器中创建模板化函数会更好(为什么?),例如:
template<typename T>
std::string Serialize(const T & data) const
{
return data.Serialize();
}
// or maybe
std::string Serialize(const Serializable & data) const
{
return data.Serialize();
}
表现出更一致的行为?
我有两个问题:
我原来的问题好坏参半了 - 我想问一下两者是否应该以相同的类型实现 - 强制从界面派生并使用模板化版本,但这似乎是不必要的,
答案 0 :(得分:0)
我没有真正连接到任何解决方案,我个人会选择最基本的接口:
struct Serializable{
virtual std::string serialize () const = 0;
};
让每个实现它的类处理如何进行血清化。有些类甚至不需要编码器,那么为什么要强制使用函数签名呢?
如果DoSerialize
只是调用它并返回其返回值,那么 serialize
似乎非常冗长,无论如何,为了工作,需要保护它。
在保持界面简洁时,不要让开发人员感到困惑 - 他们不必了解您希望序列化的工作方式 - 他们只是将对象序列化为某种二进制形式。