03/10/15 05:50
>>22
ATL/WTL の「インタフェイス登録式+デフォルト実装提供式」は「使う側」にとっては
結構便利ですよ。なぜテンプレートベースかというと、標準実装においてインタフェイスに
出さない内部的な処理( 以下の例だと IUIAdonerImplWindowless::CreateFont ) を仮想関数
無しで置き換えられるのと、標準実装においては定義していないメンバ変数、メンバ関数も
利用して実装が書けるから( 同 IUIAdonerImplWindoid::GetWindow )。
以下は単純化した例。
class IUIAdoner {
public:
virtual font get_textFont(void) = 0;
};
template class<T>
class IUIAdonerImplWindowless {
protected:
font m_font;
void CreateFont(font& f) { f = SysCreateFont(); };
public:
IUIAdonerImpl() { T::CreateFont(m_font); }
virtual font get_textFont(void) { return m_font; }
};
template class<T>
class IUIAdonerImplWindoid {
public:
IUIAdonerImplWindoid() {}
virtual font get_textFont(void) { return SysGetWindowFont(T::GetWindow()); }
};