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に置き換えると思います。はいの場合、基本クラス名 ( PenType::Write() ) を前に付ける代わりに、 StartWriting( )からWrite()だけを呼び出すことができないのはなぜですか?
4 - ポリシー ベースの設計では、意味的に無効なクラスから派生させる必要があると思います。上記のコードでは、ライターがペンを使用するという理由だけで、ライターがペンから派生しています。しかし、作家がペンであると言うのは意味的に無効です。これに対処するための他のより良い方法はありますか、それともここで何かが欠けていますか?
何かご意見は?