5

デコレータパターンについて質問があります

このコードがあるとしましょう

interface IThingy 
{
    void Execute(); 
}

internal class Thing : IThingy
{
    public readonly string CanSeeThisValue;

    public Thing(string canSeeThisValue)
    {
        CanSeeThisValue = canSeeThisValue;
    }

    public void Execute()
    {
        throw new System.NotImplementedException();
    } 
}

class Aaa : IThingy 
{
    private readonly IThingy thingy;

    public Aaa(IThingy thingy)
    {
        this.thingy = thingy;
    }

    public void Execute()
    {
        throw new System.NotImplementedException();
    } 
}


class Bbb : IThingy {
    private readonly IThingy thingy;

    public Bbb(IThingy thingy)
    {
        this.thingy = thingy;
    }

    public void Execute()
    {
        throw new System.NotImplementedException();
    } 
}

class Runit {
    void Main()
    {
        Aaa a = new Aaa(new Bbb(new Thing("Can this be accessed in decorators?")));
    } 
}

2 つのデコレータ Aaa と Bbb でラップされた、thing というクラスがあります。

AaaまたはBbbから文字列値「CanSeeThisValue」(Thingにある)に最もよくアクセスするにはどうすればよいですか

私はそれらすべての基本クラスを作成しようとしましたが、もちろん同じベースを共有していますが、ベースの同じインスタンスを共有していません

代わりに各コンストラクターに値を渡す必要がありますか?

4

1 に答える 1

2

デコレーターは、ラッピングするアイテムのパブリック インターフェイスに機能を追加します。Thingの一部ではないのメンバにデコレータがアクセスするようにしたい場合は、デコレータがの代わりにIThingyラップするかどうかを検討する必要があります。ThingIThingy

または、すべてにプロパティIThingyが必要な場合はCanSeeThisValue、そのプロパティをプロパティIThingyとして追加 (および実装) して、インターフェイスの一部にします。

interface IThingy 
{
    string CanSeeThisValue { get; }

    void Execute(); 
}

次のようにThingなります。

internal class Thing : IThingy
{
    public string CanSeeThisValue { get; private set; }

    public Thing(string canSeeThisValue)
    {
        CanSeeThisValue = canSeeThisValue;
    }

    ...

} 
于 2012-05-01T16:23:06.973 に答える