Master
2つのオブジェクトがあるとしましょうSlave
。
Slave
という名前のメソッドがありInit();
ます。問題Init()
は、ユーザーの初期化コードが含まれているため、仮想である必要があるということですが、がリストSlave
に追加されたときに自動的に呼び出される必要もあります。Master
ただし、メソッドはユーザーが呼び出し可能であってはならず、自動である必要があります。
私が最初に試したのはイベントです。オブジェクトがハンドラーで処理できるイベントSlaveInitialized
を作成します。ただし、これは機能しません。オブジェクトがたくさんあり、オブジェクトが作成されて初期化する必要がある順序を制御できないためです。Slave
OnSlaveInitialized
Slave
私が試した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.
}
}