假设我有一个具有一个属性的Object Car: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中的参数。
我希望做的是继承它,同时扩展我的属性。例如,假设我们想要一个新的对象“Expensive_Car”,其新属性为“Price”。
如何在不编写代码两次的情况下,以最“有条理”的方式利用之前的Car对象并初始化此派生类? “价格”字段保存在与“模型”字段相同的SQL表中。当然,我们需要从数据库中获取“价格”,就像我们拉出模型一样。
我的目标是利用现有的类并使用新的派生类来扩展它们,而根本不更改父类。 SQL数据库结构可以根据需要使用其他字段进行更改。
谢谢!
尼克
答案 0 :(得分:0)
你可能想要考虑其中一个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.
}
}
它不会编译,但应该给你的想法。您只想制作可以更改的部分 - 调用不同的存储过程并加载特定于派生类的属性。