NVIパターンで困った
先日uskzさんに教えてもらったNVIパターンが面白い。
後付けで「前処理、後処理」の追加ができるのが、行き当たりばったりプログラムを行なう私にぴったりだ。
だが今日困ったことがあった。
class IWindow { private: virtual void drawMain(int nX, int nY)const = 0; public: void draw(int nX, int nY)const { RECT rc = setClip(nX, nY, getWidth(), getHeight()); drawMain(nX, nY); setClip(&fc); } }; class CWindow : public IWindow { private: virtual void drawMain(int nX, int nY)const; // ウインドウを実際に書く処理を記述した. };
としていたのだが…。
class CWindowWithScrollArrow : public CWindow
としたとき困ってしまった。
CWindowWithScrollArrowは極単純に、CWindowと同じ描画を行なった上に矢印を表示するだけのものだ。
そこで
void CWindowWithScrollWrrow::drawMain(int nX, int nY)const { CWindow::draw(nX, nY); drawScrollArrowUp(nX + getWidth() / 2, nY); drawScrollArrowDown(nX + getWidth() / 2, nY + getHeight()); }
とした。
ひゃあ!無限ループだ!
とはいうものの、CWindow::drawMainはprivateなので呼び出せない。
どうしたらいいんだ。
とりあえずdrawMainをprotectedにすることで急場をしのいだ。しかしこれじゃ意味無いのではないか?
継承されることが前提のものは、自身の描画を別のprotectedなメソッドとして提供するべきか?
でも、誰がどう継承したいかなんて予測不能だ。
そもそもdrawMainをprivateにした意味も薄れる。
わかりづらかったようなので、記述を追加しました