2010-09-03 57 views
0

我是使用OOP進行編程的新手,我試圖正確使用繼承的概念。對不同類型的變量使用繼承方法

這裏是這裏的代碼是什麼我想(Link Here

public class Base 
{ 
    //Type? 
    public abstract static object Adapter();    

    public static DataTable GetWOCost(DateTime Date, string WO) 
    { 
     Application.UseWaitCursor = true; 
     DataTable dt = new DataTable(); 

     try 
     { 
      //Cast? 
      dt = Adapter().GetDataByWO(WO, Date); 
      Application.UseWaitCursor = false; 
      return dt; 

     } catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

public class Materiel : Base 
    { 
     static AllieesDBTableAdapters.CoutMatTableAdapter Adapter() 
     { 
      return new AllieesDBTableAdapters.CoutMatTableAdapter();   
     } 
    } 

    public class Labor : Base 
    { 
     static AllieesDBTableAdapters.CoutLaborTableAdapter Adapter() 
     { 
      return new AllieesDBTableAdapters.CoutLaborTableAdapter(); 
     } 
    } 

起初,我所有的代碼是在材料類。但是,我不得不添加第二個相同的類,而是添加了不同的SQL適配器。我嘗試了不同的事情,但上面的代碼有一個很大的問題。

由於類型正在改變我使用的對象,但它不會沒有強制轉換。但是因爲我不知道它是什麼類型,所以有兩個或更多具有GetWOCost方法的類,但使用不同的適配器的正確方法是什麼?

也許我應該更改爲.NET 4.0並使用動態對象?

編輯:此外似乎有抽象和靜態的問題,所以我不能在我的方法GetWOCost()沒有一個Adapter()(在基類中)的實例上使用靜態修改器。似乎只是複製粘貼會更容易,但我正試圖找出正確的方法來做到這一點。

+0

您絕對不應該爲此任務使用動態。這不是它的設計目的。 – driis 2010-09-03 17:25:10

回答

2

你應該在這種情況下做的,就是對程序的接口,它定義合同的您要使用適配器對象做什麼。如果您的實現類不共享通用接口,則可以爲它們創建一個接口。

然後你可以創建這個接口的不同實現;並在每個子類中重寫適配器方法以返回正確的接口實現。

你應該擺脫你的靜態方法,因爲多態類型的整體思想是,你可以得到不同的實例,但以不同的方式做同樣的事情。

在代碼中,這可能看起來像這樣(簡化):

public interface IAdapter 
{ 
    DataTable GetWOCost(); // Implementors must have a method with this signature 
} 

public class Base 
{ 
    public abstract IAdapter Adapter(); 

    // Methods that use IAdapter instances here. 
} 

class Materiel : Base 
{ 
    public override IAdapter Adapter() { return new CoutMatTableAdapter(); } 
} 

class Labor : Base 
{ 
    public override IAdapter Adapter() { return new CoutLaborTableAdapter(); } 
} 

然後你只需要在你的不同適配器實現新的接口,如:

public class CoutLaborTableAdapter : IAdapter 
{ 
    public DataTable GetWOCost() { /* implementation */ } 
} 
+0

我確實想過使用接口,只是不確定。 問題是: - 我使用數據集設計器來創建我的表適配器,所以當我更新某些東西時,更改任何東西可能會被破壞。我也有其他用途的查詢(在同一個表中) - 你也可以更具體地瞭解GetWOCost和GetDataByWO(GetWOCost是我調用的方法獲取數據,GetDataByWO是我的SQL查詢 - 我會放鬆我的靜態方法(不是那麼重要) – Nigol 2010-09-03 17:49:10

0

OK我做讓你的解決方案工作,GetDataByWO GetWOCost有一點點混亂。你沒有使用正確的。

public interface IAdapter 
{ 
    DataTable GetDataByWO(string WO, DateTime Date); 
} 

public abstract class Base 
{ 
    public abstract IAdapter Adapter(); 

    public DataTable GetWOCost(DateTime Date, string WO) 
    { 
     Application.UseWaitCursor = true; 
     DataTable dt = new DataTable(); 

     try 
     { 
      dt = Adapter().GetDataByWO(WO, Date); 
      Application.UseWaitCursor = false; 
      return dt; 

     } catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

public class Materiel : Base 
{ 
    public override IAdapter Adapter() 
    { 
     return new CoutMatTableAdapter();   
    } 
} 

public class Labor : Base 
{ 
    public override IAdapter Adapter() 
    { 
     return new CoutLaborTableAdapter(); 
    } 
} 

public class CoutMatTableAdapter: IAdapter 
{ 
    public DataTable GetDataByWO(string WO, DateTime Date) 
    { 
     AllieesDBTableAdapters.CoutMatTableAdapter adpt = new AllieesDBTableAdapters.CoutMatTableAdapter(); 
     return adpt.GetDataByWO(WO, Date); 
    } 
} 

public class CoutLaborTableAdapter : IAdapter 
{ 
    public DataTable GetDataByWO(string WO, DateTime Date) 
    { 
     AllieesDBTableAdapters.CoutLaborTableAdapter adpt = new AllieesDBTableAdapters.CoutLaborTableAdapter(); 
     return adpt.GetDataByWO(WO, Date); 
    } 
} 

現在來找出爲什麼勞動力類拋出一個異常(SQL部分生成)。所以看起來抽象和靜態不能很好地結合在一起(我可以理解爲什麼,但如果我的方法是靜態的,這將是非常好的)