2012-09-03 59 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

这将做到这一点。 –