0

给定一个接口,它应该是 Init to Run。必须运行初始化代码。
初始化是两个部分:一个依赖于配置,一个不依赖于配置。

如果他不想复制该代码,则可配置的必须调用另一个。

public interface IProcess
{
    bool Init(out string error);
    bool Init(ProcessConfiguration processConf, out string error);
    bool Run(object message, out ErrorCode errorCode);
    // ...
}

这是正确的实现:

public class ProcessGood : IProcess
{
       public bool Init(out string error){
              // Important Code   
              return true;
       }
       
       public bool Init(ProcessConfiguration processConf, out string error){              
              Init(out erreur);    
              // things about processConf    
              return true;
       }

我的问题是由于存在 2 个 init 方法,没有很好地遵循一个调用另一个作为默认行为的需要。
有没有办法使用接口/虚拟/等来强制一个 Init 调用另一个?

一种不正确的实现示例:

public class ProcessBad : IProcess
{
       public bool Init(out string error){
              // Important Code   
              return true;
       }
       
       public bool Init(ProcessConfiguration processConf, out string error){              
              // Init(out erreur);    // some one forgot to type this. 
              // things about processConf    
              return true;
       }
4

2 回答 2

3

如果使用抽象类是可行的,那么我可以想象这样的解决方案:

public interface IProcess
{
    bool Init(ProcessConfiguration processConf);
    // ...
}

abstract class ProcessBase : IProcess
{

    public bool IProcess.Init(ProcessConfiguration processConf)
    {
     if ( !InitInternal() ) return false;
     return InitInternal(ProcessConfiguration processConf);
    }
    
    protected abstract bool InitInternal();
    protected abstract bool InitInternal(ProcessConfiguration processConf);

}

在这里,您强制执行 init 进程的特定实现(因为必须调用两个子进程),同时将每个部分的具体实现留给子进程。

于 2020-09-08T07:59:35.070 回答
0

你确定你的代码是 C# 吗?就像在 C# 中一样,它应该看起来像这样:

public class ProcessBad : IProcess
{
    public ProcessBad(string error) 
    {
        // Important Code   
    }

    public ProcessBad(ProcessConfiguration processConf, string error) : this(error) // will be called ANYWAY
    {
        // things about processConf    
    }
}
于 2020-09-08T07:32:28.870 回答