2016-10-28 81 views
0

所以我們可以說我有一個基本接口C#中使用的接口instantation財產

public interface ISettings 
{ 
    void setSettings(); 
} 

public abstract class Settings :ISettings 
{ 
public void setSettings() 
    { 
    //do something 
    } 
} 

public class RealSettings : Settings 
{ 
    public string ConnectionString {get;set;} 
} 

我想用這種方式:

//programstuff 

private ISettings settings 


settings = new RealSettings(); 
settings.setSettings(); 

logger.Debug(settings.ConnectionString); 

當然,我不能以這種方式使用它。因爲ConnectionString不是接口的一部分。 現在使用什麼是正確的策略?

+2

只要將它從別的轉換爲'realSettings' – Petaflop

+5

除此之外,現在是瞭解並開始下面的.NET命名約定好時間,即使是一次性的示例代碼。 –

回答

1

接口背後的概念是你做而不是需要實現細節。所以可能你的設計從頭開始是錯誤的。

I 假設您需要某種類型的實現,它從配置文件和一組接口讀取設置以從各種類別(即數據庫連接字符串)讀取設置。

你應該只是談談Interfaces而不是實施細節。因此,只有將ConnectionString放在執行中的做法是錯誤的。它需要在合同中的某個地方定義。

因此,要麼:

  • ISettings

創建屬性ConnectionString或者,如果你不希望這是通用設置:

  • 創建界面IDatabaseSettings並在Realsettings執行它。然後使用private IDatabaseSettings settings

如果你不能夠改變的實施細節,如果你總是知道它是RealSettings

  • 使用(RealSettings)settings.ConnectionString。注意這表明設計不好,最好儘早避免這種結構。
+0

你是對的,抽象類應該實現ISettings – bpoepen

+0

你是對的你的假設。我正在做一些實現,其他人可以實現並使用他們自己的設置。 他們應該只實現接口(它有更多的方法,如loadSettings,驗證等) 但設置管理器永遠不會知道其他人可能會考慮哪種設置屬性。 – bpoepen

+0

所以,設置管理者(A)將例如列出(B)中可由(C)配置的所有組合設置。 (B)將使用可配置的設置來處理東西。 IE B + C應該訪問ConnectionString,而A充當中介者傳遞設置,而不必知道它們是什麼。 – bpoepen

-2

您應該首先選擇使用Interface還是Abstract Class。然後,我建議您創建一個實現ISettings的類,然後通過類實例化實例化您的接口。

public interface ISettings 
{ 
    void setSettings(); 
} 
    public class realSettings : ISettings 
    { 
     public string settings; 
     public string ConnectionString; 
     public void setSettings(){ 
     // set the connectionString here the way you want. 
     } 
    } 
ISetting set=new realSettings(); 
+0

'ConnectionString'屬性既沒有在接口上定義,也沒有在抽象類上定義,所以這個答案根本不能幫助OP。 – HimBromBeere

+0

@HimBromBeere我只是試圖指出接口的使用,你能看到嗎?我們不是在這裏完成可以完成所需工作的人員代碼。有時,我們只是簡單地說明並解釋幫助解決問題的主要思想。是的,我同意你在這裏沒有CONNECTIONSTRING PROPERTY,但是看到代碼的任何人都可以理解如何添加它並應用接口的基本用法。我想我解釋了爲什麼我省略了CONNECTIONSTRING PROPERTY以便於任何人理解原因。 – katmanco

0

以下是您的快速解決方案。

public interface ISettings 
    { 
     void SetSettings(); 
    } 

    public interface IDataBaseSettings : ISettings 
    { 
     string ConnectionString { get; set; } 
    } 

    public abstract class DatabaseSettings : IDataBaseSettings 
    { 
     public void SetSettings() 
     { 
      //todo 
     } 

     public abstract string ConnectionString { get; set; } 
    } 

    public class SqlDataBaseSettings : DatabaseSettings 
    { 
     public override string ConnectionString { get; set; } 
    } 

static void Main(string[] args) 
    { 
     IDataBaseSettings settings = new SqlDataBaseSettings(); 
     settings.SetSettings(); 
     settings.ConnectionString = "Connection String";  
    }