2015-07-20 51 views
-3

面試測試,我被要求在面試中,如果我能實現以下問題的簡單解決方案:約多態性

  • 創建管理不同的數據庫類。此類基本上具有3種方法:Open()Close()Dataset GetDataSet(..)
  • Open()Close()對於所有數據塊類型是相同的。
  • Dataset GetDataSet()表現不同每種類型的服務器
  • 我需要實現這個不用「IF」句子的方法。
  • 調用這些方法的函數不會暴露給內部功能。

static void Main(string[] args) 
{ 
    DBManager dbm = new DBManager(); 
    dbm.getDataSet(); 
} 

和此:

public Dataset getDataSet() 
{ 
    OpenConn(); 
    // get dataset 

    // sdb = new SQL/new Oracle <-- I AM NOT ALLOWED TO USE "IF" HERE 

    // that's it 
    CloseConn(); 

    return sdb; 
} 
+6

您省略問一個問題。 – 2015-07-20 05:49:07

+0

_ [我如何問一個好問題?](http://stackoverflow.com/help/how-to-ask)_ – MickyD

+0

是否允許繼承?意思是:SqlDateSet:DataSet?所以getDataSet()將是Abstract?:),或者您可以使用Switch而不是XD。或者在列表中創建3個數據集並調用getdataset(索引)XD ok ok忘記最後兩個解決方案^^ – Chaka

回答

1

與一個抽象基類嘗試它,只是覆蓋從基實現不同(經典多態性)的方法:

abstract class BaseDbManager { 
    public void OpenConn() { 
     //implementation goes here 
    } 
    public void CloseCon() { 
     //implementation goes here 
    } 
    public abstract DataSet GetDataSet(...); 
} 

然後對每種DB類型使用繼承的類:

class OracleDbManager : BaseDbManager { 
    public override DataSet GetDataSet(...) { 
     //implementation goes here 
    } 
} 

class MsSqlDbManager : BaseDbManager { 
    public override DataSet GetDataSet(...) { 
     //implementation goes here 
    } 
} 

+0

這很好,但是當我想創建一個新的對象時,我該如何知道不用「IF」創建哪個對象? –

+0

好的,我看到了問題。那麼它會很有用,在哪裏使用哪些數據庫會有所幫助。您可以不使用抽象基類,而是將該信息提供給您的類的構造函數,或者使用工廠創建內部對象。 – LInsoDeTeh