1

関連する質問 ( IReadOnlyDictionary で共分散の欠如を回避する方法は? ) を読みましたが、それが私の問題にどのように役立つかわかりません。

以下は、Box編集 ( を使用IBoxTarget) および変更の通知( を使用) が可能なIBoxSourceです。

interface IBoxTarget
{
    void DoSomething();
}

interface IBoxSource
{
    event Action SomethingIsDone;
}

class Box : IBoxTarget, IBoxSource
{
    public void DoSomething()
    {
        // . . . some logic . . .

        if (SomethingIsDone != null) SomethingIsDone();
    }

    public event Action SomethingIsDone;
}

RoomのコンテナですBox。また、次の 2 つのインターフェイスも実装します。

interface IRoomTarget
{
    IReadOnlyDictionary<string, IBoxTarget> Boxes { get; }
}

interface IRoomSource
{
    IReadOnlyDictionary<string, IBoxSource> Boxes { get; }
}

class Room : IRoomTarget, IRoomSource
{
    Dictionary<string, Box> boxes = new Dictionary<string, Box>();

    IReadOnlyDictionary<string, IBoxTarget> IRoomTarget.Boxes
    {
        get { return boxes; } // Error: "Cannot implicitly convert type ..."
    }

    IReadOnlyDictionary<string, IBoxSource> IRoomSource.Boxes
    {
        get { return boxes; } // Error: "Cannot implicitly convert type ..."
    }
}

内に 2 つの異なる辞書を作成したくありませんRoom。私は何をする必要がありますか?

4

1 に答える 1

0

私の特定のケースでは、これが役立ちました:

interface IRoomTarget
{
    IBoxTarget this[string name] { get; }
}

interface IRoomSource
{
    IBoxSource this[string name] { get; }
}

class Room : IRoomTarget, IRoomSource
{
    Dictionary<string, Box> boxes = new Dictionary<string, Box>();

    public IBoxTarget IRoomTarget.this[string name]
    {
        get { return boxes[name]; }
    }

    IBoxSource IRoomSource.this[string name]
    {
        get { return boxes[name]; }
    }
}

しかし、それが普遍的な解決策であるかどうかはわかりません

于 2013-07-26T10:56:38.613 に答える