0

假设我有一个具有一个属性的对象车:模型

我将使用数据库填充对象,如下所示:

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 数据库结构可以根据需要使用其他字段进行更改。

谢谢!

缺口

4

1 回答 1

0

您可能需要考虑使用众多 ORM 之一,例如 Entity Framework 或 NHibernate。

如果您真的想要一种自己动手的方法,那么从这里开始最简单的方法可能是向 protected overridable基类添加两种方法,一种是使用正确的存储过程名称创建 SqlCommand 对象,另一种是加载特定于派生类的属性。

您可能还应该将连接、命令和数据读取器对象的创建包装在Using语句中,以确保正确清理所有内容。

这是 ac# 示例,因为我的 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.
  }
}

它不会编译,但应该给你这个想法。您只想使可以更改的部分成为可覆盖的 - 调用不同的存储过程并加载特定于派生类的属性。

于 2012-09-03T02:19:30.800 回答