1

私は部分クラスを使用して何か奇抜なことをしましたが、混乱の少ないアプローチを使用して同じことを達成した可能性のある確立されたパターンが既に存在するかどうか疑問に思っています。

問題:

  • 派生クラスが呼び出されたときに機能するように設計された、保護されたメンバーと仮想メソッドを持つ基本クラスがありました。

  • この作業をワーカーのリストに委任したかったのです。

  • ただし、ワーカーが保護されたメンバーにアクセスできるようにする必要がありました。

私のおそらく過度に複雑な解決策:

注:これはクラスが部分的であることに依存していることに気づきました-それで問題ありませんが、それを必要としない解決策があれば素晴らしいでしょう...

void Main()
{
    ABase aBase = new ADerived();
    aBase.DoWork();
}

public partial class ABase
{
    protected int state1 = 1;
    protected int state2 = 2;
    List<ABase> workers;

    public ABase()
    {
        workers = new List<ABase>();
        CreateWorkers(workers);
    }

    protected virtual void CreateWorkers(List<ABase> workers)
    {
    }

    public ABase(ABase aBase)
    {
        this.Target = aBase;
    }

    public virtual void DoWork()
    {
        foreach (var worker in this.workers)
        {
            worker.DoWork();
        }
    }

    protected ABase Target { get; private set; }
}

public partial class ABase
{
    public class Worker1 : ABase
    {
        public Worker1(ABase aBase) : base(aBase) { }

        public override void DoWork()
        {
            Console.WriteLine (Target.state1);
        }
    }

    public class Worker2 : ABase
    {
        public Worker2(ABase aBase) : base(aBase) { }

        public override void DoWork()
        {
            Console.WriteLine (Target.state2);
        }
    }
}

public class ADerived : ABase
{
    protected override void CreateWorkers(List<ABase> workers) 
    {
        workers.Add(new Worker1(this));
        workers.Add(new Worker2(this));
    }
}

出力:

1
2
4

1 に答える 1

0

ワーカーがインスタンス フィールドにまったくアクセスしないように設計を変更します。必要DoWorkな情報を含むパラメーターを取得し、基本クラスに状態をDoWorkメソッドに渡します。

public class MyState //TODO give better name
{
    public int State1 { get; set; }
    public int State2 { get; set; }
}

public class ABase
{
    public MyState state = new MyState()
    {
        State1 = 1,
        State2 = 2
    };

    List<Action<MyState>> workers = new List<Action<MyState>>();

    public ABase()
    {
        CreateWorkers();
    }

    public void DoWork()
    {
        foreach (var action in workers)
        {
            action(state);
        }
    }

    private void CreateWorkers()
    {
        workers.Add(new Worker1().DoWork);
        workers.Add(Worker2.Process);
    }
}

public class Worker1
{
    public void DoWork(MyState state)
    {
        Console.WriteLine(state.State1);
    }
}

public class Worker2
{
    public static void Process(MyState state)
    {
        Console.WriteLine(state.State2);
    }
}
于 2012-10-29T18:11:12.960 に答える