0

Model という 1 つのプロパティを持つ Object Car があるとします。

次のように、データベースを使用してオブジェクトを設定します。

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 オブジェクトを利用して、この派生クラスを最も「整理された」方法で初期化するには、コードを 2 回記述する必要はありません。フィールド「価格」は、フィールド「モデル」と同じ SQL テーブルに保存されます。もちろん、モデルをプルしたのと同じように、データベースから「価格」を取得する必要があります。

私の目標は、既存のクラスを利用し、親クラスをまったく変更せずに、新しい派生クラスを使用してそれらを拡張することです。SQL データベース構造は、必要に応じて追加のフィールドを使用して変更できます。

ありがとう!

ニック

4

1 に答える 1

0

Entity Framework や NHibernate など、数多く存在する ORM の 1 つを検討することをお勧めします。

独自のアプローチが本当に必要な場合、ここからの最も簡単な方法は、おそらく protected overridable基本クラスに 2 つのメソッドを追加することです。1 つは正しいストアド プロシージャ名で SqlCommand オブジェクトを作成し、もう 1 つは派生クラスに固有のプロパティをロードします。

また、接続、コマンド、およびデータ リーダー オブジェクトの作成をステートメントでラップして、Usingすべてが正しくクリーンアップされるようにする必要があります。

私の VB.Net は本当に錆びているので、ac# の例を次に示します。

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 に答える