我有一个主类实现了两个接口。如何以实现每个合同的方式重构我的代码,每个合同的方法对于诸如DatabaseName之类的参数具有不同的值。
示例:
我可以在方法GetData()中配置这些值,但我想要一种更简洁的方法。
任何模式建议都是DI,域驱动,甚至完成上述内容的基本继承示例都是我正在寻找的。 p>
答案 0 :(得分:6)
听起来你需要的只是explicit interface implementation:
public class Class1 : Interface1, Interface2
{
// Note the lack of access modifier here. That's important!
Data Interface1.GetData()
{
// Implementation for Interface1
}
Data Interface2.GetData()
{
// Implementation for Interface2
}
}
显然,这两个方法可以使用参数调用一个公共方法来指定数据库名称或类似名称。
答案 1 :(得分:0)
重构通常是通过注意代码气味以及您最终遇到必须实现2抽象的情况来实现的,这种抽象暴露了类似的功能是代码气味。 如果没有对问题有更多的了解,我可能无法为您提供确凿的答案,但理解有限,这就是我的建议。有两个不同的具体实现,每个实现一个接口,并有一个工厂,将注入客户端,使客户做出故意决定,其中一个实现是需要的。如果这些具体类共享通用功能,您可以始终将其抽象为公共父类。
public interface ISQLReader
{
string GetData();
}
public interface IOracleReader
{
string GetData();
}
public abstract class Reader
{
protected void CommonFunctionaility()
{
}
}
public class MSSQLReader : Reader, ISQLReader
{
public string GetData()
{
return "MSSQL";
}
}
public class OracleReader : Reader, IOracleReader
{
public string GetData()
{
return "Oracle";
}
}
public interface IReaderFactory
{
OracleReader CreateOracleReader();
MSSQLReader CreateMSSQLReader();
}
public class ReaderFactory : IReaderFactory
{
public MSSQLReader CreateMSSQLReader() => new MSSQLReader();
public OracleReader CreateOracleReader() => new OracleReader();
}
public class ReaderClient
{
private IReaderFactory _factory;
public ReaderClient(IReaderFactory factory)
{
this._factory = factory;
}
}
明确的接口实现是一种技术,应该限制功能的使用,直到客户端通过做出慎重的决定并在那里进行显式转换。