假设我有两个对象,Master
并且Slave
.
Slave
有一个名为Init();
. 问题Init()
是,我需要它是虚拟的,因为它包含用户的初始化代码,但我还需要它在Slave
添加到Master
列表时自动调用。但是该方法不能被用户调用,它必须是自动的。
我尝试的第一件事是一个事件——创建SlaveInitialized
一个Slave
对象可以在其OnSlaveInitialized
处理程序中处理的事件。但这行不通,因为有很多Slave
对象,我无法控制它们的创建顺序和需要初始化的顺序。
我尝试的第二件事是内部方法——internal Init()
当对象被添加到Master
列表时会被调用,一切看起来都很好,直到我意识到这样做我不能在公共类中继承该方法。
所以我做的第三件事并且有效的是 - 我创建了一个名为的内部方法_Init()
,它简单地调用 a protected virtual Init()
,它解决了我的问题。
现在我想问 - 我是否只是因为我错过了这里明显的痛苦解决方案而感到愚蠢,或者这是通常的做法?什么是正确的方法?我希望我明白了我要问的问题,我尽力解释了这个问题。
谢谢你的帮助
这是我现在拥有的代码的要点。它的要点是当您通过 Master.AddSlave() 将任何 Slave 对象添加到 Master 的列表时,自动调用 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.
}
}