隐藏的函数调用

时间:2012-07-30 19:14:27

标签: c# .net

假设我有两个对象MasterSlave

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.
    }
}

2 个答案:

答案 0 :(得分:1)

据我所知,有两种基本方法可以做到这一点。

  1. 与您已尝试的一样,internal InitInternal()方法调用protected virtual Init()
  2. protected internal virtual Init(),在您的程序集外部自动成为protected方法。

答案 1 :(得分:1)

虽然这并没有像你想要的那样回答问题,但我觉得这可能是一个合适的解决方案。

如果多次调用Init方法,我建议抛出InvalidOperationException

描述:当方法调用对象的当前状态无效时引发的异常。

在我看来,你的责任不应该是你的对象被滥用,只要文档写得正确,你的对象属性和方法名称描述他们做了什么,它应该足以让大多数用户(开发者)消费你的代码,以了解它是如何工作的。

对于那些决定自己调用Init然后添加到Master对象的人,可以抛出该异常,以便他们知道他们使用该类的方法不正确。

编辑: 命名方法OnInit可能是一个好主意,这样一来,类的用户就会指出不应该直接调用它。