2

私のアプリケーションは、独立したサーバーとクライアントで構成されています。それらは、サーバーによって作成および変更されたオブジェクトを介して通信します。クライアントには、このオブジェクトの読み取り専用インターフェイスが提供されます。私の知る限り、これが OOP でカプセル化を維持する正しい方法です。例を参照してください:

// Client-side

interface IBox<T> where T : ITool
{
    IEnumerable<T> Tools { get; }
}

interface ITool
{
    void Use();
}

// Server-side

class Box : IBox<Tool>
{
    public List<Tool> ToolList = new List<Tool>();

    public IEnumerable<ITool> Tools
    {
        get { return ToolList; }
    }
}

class Tool : ITool
{
    string _msg = "default msg";
    public string Msg
    {
        get { return _msg; }
        set { _msg = value; }
    }

    public void Use()
    {
        Console.WriteLine("Tool used! Msg: {0}", _msg);
    }
}

ご覧のとおり、オブジェクトが階層を形成するため、ジェネリックを使用する必要があります。

だけでなく一般化する必要があるRoominterface を持つクラスを追加することを決定するまで、それは良さそうに見えました。IRoomIBoxITool

interface IRoom<B, T>
    where B : IBox<T>
    where T : ITool
{
    IEnumerable<B> Boxes { get; }
}

class Room : IRoom<Box, Tool>
{
    public List<Box> BoxList = new List<Box>();

    public IEnumerable<Box> Boxes
    {
        get { return BoxList; }
    }
}

Roomここで、ボックスだけでなく構成されていると想像してください。そこには、いくつかのタイプのコレクションでもある、まったく異なるもののコレクションが少なくとも3つ必要です。したがって、巨大なツリーが存在する必要があり、私のルート クラスは次のようになります。Room : IRoom<Box, Tool1, Tool2, Tool3, Wardrobe, Coat, Jeans, Hat, Table, Computer, Book, Pen>

わかりません、そうです。だから、私は尋ねています、私のタスクを実装する真のOOP方法は何ですか? (リフレクションなし、カプセル化の破壊、型キャスト、またはその他の悪いトリックなし)

4

1 に答える 1