0

ビジネス モデル オブジェクト用と UI 用の 2 つのインターフェイス階層を作成しようとしています。レイヤー間の疎結合が重要であることはわかっていますが、アプリケーションの一部では図を描画する必要があるため、モデル オブジェクトを対応するグラフィカル表現ですぐに利用できるようにする必要があり、モデル オブジェクトのインターフェイスを保持する共通のレイヤーが必要です。

共通クラス ライブラリ コード:

public interface IBase {}
public interface IBookObject : IBase {}
public interface ITapeObject : IBase {}

public class Book : IBookObject {}

グラフィック層コード:

public interface IModelObject<T> 
{
  T ModelObject { get; set; } // might be a book or tape , etc
}

public class GraphicObject<T> : IModelObject<T>
{
  public T ModelObject { get; set; }
}

コードの使用:

IBookObject bk = new Book();
var go = new GraphicObject<IBookObject>(); // will fail later
//var go = new GraphicObject<IBase>(); // will succeed later

go.ModelObject = bk;

if (go is IModelObject<IBase>) // can't use is IModelObject<IBookObject>
                               // as go might be GraphicObject<ITapeObject>
{
  Debug.WriteLine("Success");
}

したがって、IBase をテストする (そして ModelObject にアクセスする) 場合は、元のオブジェクトが派生インターフェイスではなく IBase で作成されていることを確認する必要があり、これが後でバグの原因になるようです。私の質問は次のとおりです。

1) 私は何か恐ろしいことをしていますか?! :)私はより良いアプローチを見落としているかもしれません..

2) それに失敗した場合、新しい反変性 c# 4 手法を使用して、IBase から派生したインターフェイスのライン テストを行う方法はありますか? あるいは、IBook が IBase を継承せず、Book (および Tape) が IBook と IBase の両方を別々に実装していればうまくいくと思います。

GraphicObject<IBookObject>()3) それに失敗した場合、 andの構築を防ぐ方法はありGraphicObject<ITapeObject>()ますか?

ありがとうございました!

4

1 に答える 1

0

これは機能しますか?

public interface IBase { }
public interface IBookObject : IBase { }
public interface ITapeObject : IBase { }

public class Book : IBookObject { }

public interface IModelObject
{
    IBase ModelObject { get; set; } // might be a book or tape , etc
}


public class GraphicObject<T> : IModelObject
    where T: class, IBase
{
    public T ModelObject { get; set; }

    #region IModelObject Members

    IBase IModelObject.ModelObject
    {
        get
        {
            return ModelObject;
        }
        set
        {
            ModelObject=value as T;
        }
    }

    #endregion
}

class Program
{
    static void Main(string[] args)
    {
        IBookObject bk=new Book();

        var go=new GraphicObject<IBookObject>(); // will fail later

        //var go = new GraphicObject<IBase>(); // will succeed later

        go.ModelObject=bk;

        if(go is IModelObject) // can't use is IModelObject<IBookObject> as go might be GraphicObject<ITapeObject>
        {
            Debug.WriteLine("Success");
        }
    }
}
于 2012-05-21T14:04:11.403 に答える