使用 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
,但这涉及代码重复。
您将如何设计解决此问题的方法?
我要做的是删除
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