2017-10-20 43 views
5

我有两个接口由一个主类实现。我如何以实现每个合约的方式重构我的代码,每个合约的方法对于参数(例如DatabaseName)具有不同的值。合同的不同属性值

实施例:

  1. 的Class1器具接口1,接口2
  2. Interface1.GetData()具有数据库名设置为数据库1
  3. Interface2.GetData()具有数据库名组到数据库2

我可以在方法GetData()中配置这些值,但我想要一个更干净的方法。

任何模式建议是DI,域驱动,甚至完成上述的基本继承示例是我正在寻找。

回答

7

这听起来像所有你需要的是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 
    } 
} 

显然,这两种方法都可以拨打的共同方法与参数指定数据库名称或类似。

+0

我的想法是刚刚吹袭乔恩斯威特甚至回答新手问题,如果我在这两个接口有100个方法怎么办? –

+0

@ZohaibAmin:那么我会非常担心那些接口太大而无法启动。您只需要对希望实现不同的方法使用显式实现,但您可以混合使用隐式和显式接口实现。 –

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; 
     } 
    } 

显式接口实现技术,直到客户端已经并通过使一个深思熟虑的决定明确造型,那里应该限制的功能使用。