具有受保护方法和运行时基础处理程序的类继承设计

问题描述 投票:0回答:1

使用 C#,我得到了一个名为 BaseConfigurations 的类,它处理 CRUD 操作。该类还包含一个受保护的方法,该方法在 CRUD 处理方法中使用:

public class BaseConfigurations : ICRUDHandler
{
    public virtual bool CreateSetting(string someData)
    {
        //some logic
        ProtectedMethod();
        //more logic
    }
    
    protected virtual void ProtectedMethod() { ... }
}

现在有一个不同的版本,可以处理有点不同的 CRUD 操作:

public class BaseConfigurationsV2 : BaseConfigurations { ... }

有 2 个

BaseConfigurations
BaseConfigurationsV2
实例同时存在,应该根据我拥有的一些逻辑来调用。

现在还有另一个类专门处理秘密数据:

public class SecretConfigurations : BaseConfigurations
{
   public ICRUDHandler _crudHandler;
   public SecretConfigurations(ICRUDHandler handler) 
   { 
      _crudHandler = handler; //this handler gets either the instance of `BaseConfigurations` or `BaseConfigurationsV2` 
   }

   public override bool CreateSetting(string data)
   {
      _crudHandler.CreateSetting(data);
      //adds additional logic
   }

   public override void ProtectedMethod() { ... }
}

我的问题是,因为 SecretConfigurations 接收的 ICRUDHandler 是 BaseConfigurations 或 BaseConfigurationsV2,所以它不知道 SecretConfigurations 中覆盖的受保护方法,并且不会调用它。

修复此问题的简单方法可能是创建另一个

SecretConfigurationsV2
类,该类将从 BaseConfigurationsV2 派生,然后将处理程序初始化为
SecretConfigurations
SecretConfigurationsV2
,但这涉及代码重复。

您将如何设计解决此问题的方法?

c# inheritance design-patterns
1个回答
0
投票

我要做的是删除

SecretConfigurations
中的继承,因为您将
ICRUDHandler
注入到其构造函数中:

public class SecretConfigurations
{
   public ICRUDHandler _crudHandler;
   public SecretConfigurations(ICRUDHandler handler) 
   { 
      _crudHandler = handler; //this handler gets either the instance of 
          // `BaseConfigurations` or `BaseConfigurationsV2` 
   }
   
   // ... the other code is omitted for the brevity
}

并尝试为类指定另一个名称,以避免该类的未来用户不清楚。例如:

CrudHandler

© www.soinside.com 2019 - 2024. All rights reserved.