2012-09-03 79 views
0

派生類通過數據庫假設我有一個屬性的對象車:型號初始化.NET

我會使用數據庫如下填充對象:

Public Class Car 

    Public Property Model() As String 
     Get 
      Return _Model 
     End Get 
     Set(ByVal value As String) 
      _Model = value 
     End Set 
    End Property 
    Private _Model As String 

    Private Sub SetObjectData(ByVal theObjReader As System.Data.SqlClient.SqlDataReader) 
     Try 
      Me._Model = theObjReader("Model").ToString() 
     Catch ex As Exception 
      Throw New Exception("Unable to Initialize Car.") 
     End Try 
    End Sub 

    Public Sub New(ByVal Car_ID As Integer) 
     Dim connection As New SqlConnection(DBTool.DataConnectionString) 
     Try 
      Dim cmd As SqlCommand 
      cmd = New SqlCommand("getCarByCar_ID", connection) 
      cmd.CommandType = CommandType.StoredProcedure 

      cmd.Parameters.AddWithValue("@Car_ID ", Car_ID) 

      connection.Open() 
      Dim objReader As SqlDataReader = cmd.ExecuteReader() 

      Do While objReader.Read() 
       SetObjectData(objReader) 
      Loop 

      objReader.Close() 
      connection.Close() 
     Catch ex As Exception 
      connection.Close() 
     End Try 
    End Sub 

End Class 

現在,讓我們假設爲因爲這個類被封裝在一個DLL中。

我想要做的是繼承它,同時消耗我的屬性。例如,假設我們想要一個新的對象「Expensive_Car」和一個新的屬性「價格」。

如何利用以前的Car對象並以最「有組織」的方式初始化此派生類而無需兩次編寫代碼? 「價格」字段保存在與「模型」字段相同的SQL表中。當然,我們需要從數據庫中獲取「價格」,就像我們拉取模型一樣。

我的目標是利用現有的類並使用新的派生類來擴展它們,而無需改變父類。 SQL數據庫結構可根據需要使用其他字段進行更改。

謝謝!

尼克

回答

0

你可能要考慮很多的ORM有像實體框架或NHibernate的之一。

如果你真的想要一個自己動手的方法,最簡單的方法可能是將兩個protected overridable方法添加到基類中,一個用正確的存儲過程名創建SqlCommand對象,另一個用於加載屬性特定於派生類。

您應該還可以在Using語句中創建連接,命令和數據讀取器對象,以確保正確清理所有內容。

這裏是一個C#的例子,因爲我的VB.Net真的生鏽:

public class Car 
{ 
    public Car(int carId) { 
    CarId = carId; 
    LoadProperties(); 
    } 

    public int CarId { get; set; } 
    public string Model { get; set; } 

    protected virtual SqlCommand CreateCommand() { 
    // Override this method in derived classes to call a different procedure. 
    return new SqlCommand("getCarByCar_ID"); 
    } 

    protected virtual void LoadMoreProperties(SqlDataReader reader) 
    { 
    // Override this method in derived classes to load additional properties. 
    } 

    private void LoadProperties() { 
    using(var connection = new SqlConnection(DBTool.ConnectionString)) { 

     using(cmd = CreateCommand()) { 
     using(var reader = cmd.ExecuteReader()) { 
      // Read Car specific properties 

      Model = // get model from reader. 


      LoadMoreProperties(reader); 
     } 
     } 
    } 
    } 
} 

public class ExpensiveCar : Car { 

    public decimal Price { get; set; } 

    protected override SqlCommand CreateCommand() { 
    return new SqlCommand("getExpensiveCarByCar_ID"); 
    } 

    protected override void LoadMoreProperties(SqlDataReader reader) { 
    Price = // get price from reader. 
    } 
} 

它不會編譯,但應該給你的想法。您只想製作可更改的部分 - 調用不同的存儲過程並加載特定於派生類的屬性。

+0

我想減少「重複」代碼的數量。當我所需要做的就是初始化某些屬性時,覆蓋這些方法似乎會擊敗目的。我想這是最簡單的方法,但不是一個更有效的方法? –

+0

我已經添加了一個我的意思的例子。你應該有很少重複的代碼。 –

+0

這將做到這一點。 –