假设我有一辆只有一个属性的对象车:Model
我将使用数据库填充对象,如下所示:
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中。
我想做的是继承它,同时花费我的财产。例如,假设我们想要一个具有新属性"Price"的新对象"Expensive_Car"。
如何在不写两次代码的情况下,利用以前的Car对象并以最"有组织"的方式初始化这个派生类?字段"价格"与字段"模型"保存在同一SQL表中。当然,我们需要从数据库中获得"价格",就像我们提取模型一样。
我的目标是利用现有的类,并在不更改父类的情况下使用新的派生类来扩展它们。SQL数据库结构可以根据需要使用其他字段进行更改。
谢谢!
Nick
您可能需要考虑许多ORM中的一个,比如Entity Framework或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.
}
}
它不会编译,但应该会给你这个想法。您只想让可以更改的部分可重写——调用不同的存储过程并加载特定于派生类的属性。