这是我试图实现的粗略图像(它不会编译,所以认为它是伪代码)。请注意,尽管该示例基于公钥密码方案,但问题是关于设计模式、模板和继承。
class CryptoProvider
{
public:
template <typename T>
virtual T Encrypt ()
{
T data;
return data;
}
};
class Paillier : public CryptoProvider
{
public:
typedef int Ciphertext;
Ciphertext Encrypt ()
{
Ciphertext data;
return data;
}
};
class ElGamal : public CryptoProvider
{
public:
struct Ciphertext
{
public:
int c1;
int c2;
};
Ciphertext Encrypt ()
{
Ciphertext data;
return data;
}
};
基本上,我想在 CryptoProvider 中提供一些通用功能,如果需要,它可以被派生类覆盖,否则我会得到很多重复的代码。如果Encrypt
只是需要创建一个变量并调用另一个函数,那么我不想在每个派生类中都编写这段代码,但是,如果派生类需要对数据进行一些额外的处理,它应该能够覆盖基础方法。
我遇到的最大限制是通过指定完全不同的返回类型来以某种方式覆盖 Encrypt 函数。有人可以为我指出如何实现这一目标的正确方向吗?我应该坚持传统继承还是应该尝试使用CRTP进行编译时/静态多态性?我不知道从哪里开始。
我还想强制派生类来实现某些方法,但我不确定如何实现这一点,如果第一个问题的解决方案要求我放弃标准继承(并且我不会从虚拟方法中受益).. .