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. Если да, то почему я не могу называть только Write() из StartWriting() вместо префикса имени базового класса (PenType:: Write())?
4 - Я думаю, что основанный на политике дизайн заставляет вас выводить из классов, которые семантически недействительны. В приведенном выше коде писатель получается из пера только потому, что писатель использует ручку. Но говоря, что писатель - это перо, оно семантически недействительно. Есть ли другой лучший способ решить эту проблему, или я здесь что-то не хватает?
Любые мысли?