0

私のビジネスオブジェクトがデータをロードする方法として、私は本当に不自然な例を持っています。ただし、以下に示すような状況を防ぎたいと思います。ここには欠点があることは知っていますが、それは(これまでのところ)まさにその通りです!インターフェイスなどに再構築せずにこれを実現するにはどうすればよいですか?

Public Class Car

  Public Property Passengers As Integer

  Public Shared Sub Fill(c As Car, r As SqlDataReader)
    Passengers = r.GetInt32(0)
  End Sub

End Class

Public Class UsedCar
  Inherits Car

  Public Property PreviousOwner As String

  Public Shared Sub FillUsed(l As Limo, r As SqlDataReader)
    Passengers = r.GetInt32(0)
    PreviousOwner = r.GetString(1)
  End Sub

End Class

Public Sub CreateVehicles()

  Dim c As New Car()
  Car.FillWithStuff(c, GetSqlReader(carId))

  Dim l As New UsedCar()
  UsedCar.FillUsed(l, GetSqlReader(usedCarId)) 'Great
  Car.Fill(l, GetSqlReader(usedCarId)) 'No! << Stop this at once!
  UsedCar.Fill(l, GetSqlReader(usedCarId)) '<<< Even more wrong!

End Sub
4

2 に答える 2

1

コンストラクターをプライベートにし、さまざまなFill()メソッドをインスタンス化してまったく新しいオブジェクトを返すようにします。または、Fill()コードをコンストラクター自体に移動することもできます。メソッドはデータベースの結果と非常に密接に関連しているため、別のオプションは、コンストラクターを「フレンド」としてマークし、Fill()メソッドをデータレイヤーと共存する別のモジュールに移動することです。

ここでの目標は、車を作成する唯一の方法は、コンパイル時に適切なタイプが一致することを確認する位置にある定義済みのファクトリメソッドを使用することです。

于 2012-10-31T14:08:01.127 に答える
1

例外をスローする以外にそれを要求する方法はありません。例えば:

Public Shared Sub FillWithStuff(c As Car)
    If Not (TypeOf c Is Car) Then
        Throw New Exception("Must be a Car")
    End If
    Passengers = 4
End Sub

しかし、あなたが提供する単純化された例は、あなたの状況で、リムジンが有効な車ではない理由を十分に説明していません。実際、それが有効な車ではない場合は、車から継承するべきではありません。carとlimoが2つの無関係なクラスであり、両方が共通の機能に対して同じ依存関係のビジネスクラスを共有するように、コードをリファクタリングする必要がある可能性があります。

于 2012-10-31T13:14:55.377 に答える