2

デスクトップ ウィンドウを表すクラスがあり、一部にはラッパー ( )Windowを介してタイトルを付けることができ、一部はラッパー ( ) を介して他のウィンドウの上に配置できます。TitledWindowTopWindow

UML ビュー

今、私は のビューモデルを作成しようとしておりWindow、それらの 3 つのインターフェイス ( IWindowITitledWindowおよびITopWindow) をサポートする必要があります。次のようになります。

public class WindowViewModel : ITopWindow, ITitledWindow
{
    private readonly IWindow _window;

    public WindowViewModel(IWindow window)
    {
        _window = window;
    }

    public IntPtr Handle
    {
        get { return _window.Handle; }
    }

    public Boolean? IsTopmost
    {
        get
        {
            var thisTopWindow = _window as ITopWindow;
            if (thisTopWindow == null)
                return null;
            return thisTopWindow.IsTopmost;
        }
        set
        {
            var thisTopWindow = _window as ITopWindow;
            if (thisTopWindow != null)
                thisTopWindow.IsTopmost = value;
        }
    }

    public String Title
    {
        get
        {
            var thisTitledWindow = _window as ITitledWindow;
            return thisTitledWindow == null ? null : thisTitledWindow.Title;
        }
    }
}

これは私がビューモデルを取得する方法です:

public IList<WindowViewModel> OpenWindows
{
    get
    {
        var windowViewModels =
            from window in _windowEnumerator.EnumerateWindows()
            let titledWindow = new TitledWindow(window, _windowTitleReader)
            let topWindow = new TopWindow(titledWindow, _topmostManager)
            select new WindowViewModel(topWindow);
        return windowViewModels.ToList();
    }
}

問題は、階層内の最初のラッパーしか取得できないことです。

のすべてのウィンドウOpenWindowsもですが、フィールド内でラップするためでITopWindowはありません(おそらくこのままにしておく必要があります)。ITitledWindowprivate readonly

私が念頭に置いている唯一の解決策は、それらを結合するクラスを導入することです (のようにTitledTopWindow) が、ウィンドウのすべてのバリエーションに対して作成する必要があり、それは面倒です (特に、後で新しい機能を導入するために新しいラッパーを導入するとき)。 .

それを行う適切な方法は何ですか?

更新:
私の検索では、機能を拡張するためにラッパーを使用しているが、API を拡張するために使用していないことを読みました (これがここでの目標です)。

この問題が私が意図した方法で対処できない場合、どうすればこの方法で機能を追加できますか?

4

1 に答える 1