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 是两个不相关的类,它们共享相同的依赖业务类以实现通用功能。

于 2012-10-31T13:14:55.377 回答