2017-10-20 77 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; 
     } 
    } 

顯式接口實現技術,直到客戶端已經並通過使一個深思熟慮的決定明確造型,那裏應該限制的功能使用。