I have a class which composes objects of a class it inherits from,
which just doesn't seem right.
Разве это не определение композита?
(parameter values are bit flags)
Это та часть дизайна, которую я бы подверг сомнению.Возможно, лучшим именем для параметра будет FlagSet?
Хорошо скрывать побитовые тесты за интерфейсом, но кажется, что наследование может быть излишним для решения проблемы с хорошо известными решениями в базовой информатике.
However, that is somewhat wasteful b/c the general case would be
CompositeParameters which contained just one Parameter.
Суть составного шаблона состоит в том, что объект Leaf представляет простой случай, объект Composite представляет сложный случай, и клиентский код может обрабатывать оба случая одинаково.Если вашему интерфейсу требуется, чтобы клиентский код различал эти два компонента или выполнял итерацию по компонентам базового класса, тогда вы на самом деле не получаете никакого значения от использования шаблона.
Например, если ваша основная задача -тестируя, тогда базовый класс может иметь метод:
bool Test() const;
Конечная реализация класса будет выглядеть следующим образом:
bool LeafTester::Test() { return _DoTest(); }
Реализация составного класса будет выглядеть следующим образом:
bool CompositeTester::Test() {
bool success = true;
for (int i = 0; i < m_count; i++)
success &= m_components[i].Test();
return success;
}
И клиенты всегда будут использовать такой код:
// tester could be a Composite or a leaf, but we don't care:
bool testResult = tester.Test();
Я использовал цикл for, чтобы сделать пример простым.На практике я бы использовал STL.