0

假设我有两个对象,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.
    }
}
4

2 回答 2

1

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

  1. 就像您已经尝试过的那样,一个internal InitInternal()调用protected virtual Init()
  2. A protected internal virtual Init(),它在您的程序集之外自动成为一种protected方法。
于 2012-07-30T19:25:49.337 回答
1

虽然这并不能以您可能想要的方式回答问题,但我认为这可能是一个合适的解决方案。

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

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

在我看来,保护你的对象不被滥用不应该是你的责任,只要文档编写得当,你的对象属性和方法名称描述了它们的作用,对于大多数使用你的代码的用户(开发人员)来说应该足够了了解它是如何工作的。

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

编辑:命名该方法OnInit可能是一个好主意,这样类的用户就可以指示它不应该由他们自己直接调用。

于 2012-07-30T19:39:54.013 回答