struct InkPen
{
void Write()
{
this->WriteImplementation();
}
void WriteImplementation()
{
std::cout << "Writing using a inkpen" << std::endl;
}
};
struct BoldPen
{
void Write()
{
std::cout << "Writing using a boldpen" << std::endl;
}
};
template<class PenType>
class Writer : public PenType
{
public:
void StartWriting()
{
PenType::Write();
}
};
int main()
{
Writer<InkPen> writer;
writer.StartWriting();
Writer<BoldPen> writer1;
writer1.StartWriting();
return 0;
}
我将上述代码作为基于学习策略的设计的一部分编写。我对上面的代码有几个问题
1 - 这个实现看起来正确吗?我的意思是:它真的看起来像基于策略的设计吗?
2 - 我现在可以将任何类型的笔挂到作家身上。但是当我得到一支没有默认构造函数(只有参数化构造函数)的笔时,我该怎么办?我将如何处理这种情况?
template<class PenType>
class Writer : public PenType
{
public:
void StartWriting()
{
PenType::Write();
}
};
3 - 当使用上述代码时
Writer<InkPen> writer;
我猜编译器会将PenType替换为InkPen。如果是,为什么我不能只从StartWriting()调用Write( )而不是为基类名称添加前缀(PenType::Write())?
4 - 我认为基于策略的设计迫使您从语义上无效的类中派生。在上面的代码中,writer 是从 pen 派生的,只是因为 writer 使用的是 pen。但是说作家是一支笔在语义上是无效的。有没有其他更好的方法来解决这个问题,或者我在这里遗漏了什么?
有什么想法吗?