Приветствую всех!класс структура для заметок приложение
Я пишу небольшое приложение для хранения разных заметок (memos) и имеет структуру классов, которые мне не нравятся. У меня есть core: MemoInterface и core: MemoBuilder классы в ядре (реализация не важна). Тогда в GUI у меня есть некоторые реальные классов мемо (например: SimpleMemo, TodoMemo, и т.д ...), которые знают, как сделать себя и производные от гуя :: MemoInterace и гуя :: TabsBuilder который создает новую вкладку в окне и запрашивает каждую заметку, чтобы нарисовать себя на вновь созданной вкладке.
В моей РЕАЛИЗАЦИЯ гуй :: TabsBuilder :: Build() вызовы GUI :: MemoBuilder :: Build() и попытаться использовать dynamic_cast, чтобы понять, что MemoInterface от GUI. На самом деле это момент, который мне не нравится, и вопрос : Как улучшить или переписать структуру, где core: MemoBuilder ничего не знает о графическом интерфейсе, но может запросить каждую заметку для рисования.
Извините, если это не очень понятно. Следующий код может сделать его более понятным.
namespace core {
class MemoInterface {
};
class MemoStorage { ... };
class MemoBuilder {
public:
... some code ...
virtual MemoInterface* Build();
private:
MemoStorage& storage_; // put here all created MemoInterface objects
};
} // namespace
namespace gui {
class MemoInterface : public core::MemoInterface {
public:
virtual void Draw(SomeWindowClass* dst) = 0;
};
class SimpleMemo : public MemoInterface { // draw implementation };
class TodoMemo : public MemoInterface { };
class TabsBuilder : public core::MemoBuilder {
public:
... some code ...
virtual core::MemoInterface* Build() {
// I don't like dynamic_cast, think that it's not a good oop way
gui::MemoInterface* memo = dynamic_cast<gui::MemoInterface*>core::MemoBuilder::Build();
if (!memo)
throw std::exception();
memo->Draw(wnd_); // or Draw(wnd_->createNestedTab()->window()) it doesn't matter
return memo;
}
private:
SomeWindowClass* wnd_;
};
} // namespace gui
Just FYI: То, что вы называете 'реализация', называется' реализация' – Paranaix
. Пожалуйста, не могли бы вы точно уточнить свой вопрос? –
@Paranaix, thx - исправлено – Peter