假设我有两个对象Master
和Slave
。
Slave
有一个名为Init();
的方法。关于Init()
的问题是,我需要它是虚拟的,因为它包含用户的初始化代码,但我还需要在Slave
添加到Master
时自动调用它列表。但是该方法不能由用户调用,它必须是自动的。
我尝试的第一件事是一个事件 - 创建一个SlaveInitialized
对象可以在其Slave
处理程序中处理的事件OnSlaveInitialized
。这不会起作用,因为有很多Slave
个对象,我无法控制它们的创建顺序,需要初始化。
我尝试的第二件事是内部方法 - 当对象被添加到internal Init()
的列表时会调用Master
并且一切似乎都没问题,直到我意识到这样做我不能继承公共课中的方法。
所以我做的第三件事就是这样 - 我创建了一个名为_Init()
的内部方法,只需调用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.
}
}
答案 0 :(得分:1)
据我所知,有两种基本方法可以做到这一点。
internal InitInternal()
方法调用protected virtual Init()
protected internal virtual Init()
,在您的程序集外部自动成为protected
方法。答案 1 :(得分:1)
虽然这并没有像你想要的那样回答问题,但我觉得这可能是一个合适的解决方案。
如果多次调用Init
方法,我建议抛出InvalidOperationException。
描述:当方法调用对象的当前状态无效时引发的异常。
在我看来,你的责任不应该是你的对象被滥用,只要文档写得正确,你的对象属性和方法名称描述他们做了什么,它应该足以让大多数用户(开发者)消费你的代码,以了解它是如何工作的。
对于那些决定自己调用Init
然后添加到Master
对象的人,可以抛出该异常,以便他们知道他们使用该类的方法不正确。
编辑:
命名方法OnInit
可能是一个好主意,这样一来,类的用户就会指出不应该直接调用它。