0

Master2つのオブジェクトがあるとしましょうSlave

Slaveという名前のメソッドがありInit();ます。問題Init()は、ユーザーの初期化コードが含まれているため、仮想である必要があるということですが、がリストSlaveに追加されたときに自動的に呼び出される必要もあります。Masterただし、メソッドはユーザーが呼び出し可能であってはならず、自動である必要があります。

私が最初に試したのはイベントです。オブジェクトがハンドラーで処理できるイベントSlaveInitializedを作成します。ただし、これは機能しません。オブジェクトがたくさんあり、オブジェクトが作成されて初期化する必要がある順序を制御できないためです。SlaveOnSlaveInitializedSlave

私が試した2番目のことは、内部メソッドですinternal Init()。オブジェクトがMasterのリストに追加されたときに呼び出され、パブリッククラスでメソッドを継承できないことに気付くまで、すべて問題ないようです。

だから私がやった3番目のことはこれです-私は_Init()単にを呼び出すという内部メソッドを作成しましたprotected virtual Init()、それは私の問題を解決しました。


今、私は尋ねたいと思います-私はここで痛々しいほど明白な解決策を逃しているので、私は愚かであるという大きなストライキを持っていますか、それともこれは通常行われている方法ですか?適切な方法は何ですか?私が求めていることの要点がわかったと思います。私は問題を説明するために最善を尽くしました。

助けてくれてありがとう


これが私が今持っているコードの要点です。そのポイントは、Master.AddSlave()を介してマスターのリストにスレーブオブジェクトを追加するときに、Init()が非表示で自動的に呼び出されるようにすることです。

public class Master
{
    private List<Slave> _slaves;

    public void AddSlave(Slave slave)
    {
        // Call the "hidden" init
        slave._Init();
        _slaves.Add(slave);
    }
}

public class Slave
{        
    internal void _Init()
    {
        // Call the topmost overloaded method.
        Init();
    }

    protected virtual void Init()
    {

    }
}

public class SuperSlave : Slave
{        
    protected override void Init()
    {
        // Now this method gets called automatically
        // when Master.AddSlave adds this object.
    }
}
4

2 に答える 2

1

私の知る限り、これを行うには2つの基本的な方法があります。

  1. すでに試したようにinternal InitInternal()protected virtual Init()
  2. protected internal virtual Init()アセンブリの外部で自動的にprotectedメソッドになるA。
于 2012-07-30T19:25:49.337 に答える
1

これはあなたが望むように質問に答えることはできませんが、これは適切な解決策である可能性があると私は感じています。

メソッドが複数回呼び出される場合は、 InvalidOperationExceptionをスローすることをお勧めします。Init

説明:オブジェクトの現在の状態に対してメソッド呼び出しが無効な場合にスローされる例外。

私の意見では、オブジェクトが悪用されないように監視するのはあなたの責任ではありません。ドキュメントが適切に記述されていて、オブジェクトのプロパティとメソッド名がオブジェクトの機能を説明している限り、ほとんどのユーザー(開発者)がコードを消費するのに十分なはずです。それがどのように機能するかを理解してください。

自分自身を呼び出しInitてからオブジェクトに追加することにしたMaster場合は、その例外をスローして、クラスを使用するためのメソッドが正しくないことを認識できるようにすることができます。

編集:メソッドに名前OnInitを付けるのは良い考えかもしれません。そうすれば、クラスのユーザーは、自分で直接呼び出すべきではないことを示すことができます。

于 2012-07-30T19:39:54.013 に答える