我有点困惑使用OOP,我的意思是,我已经知道(或者我猜)什么是类,对象,方法,属性和类似的东西,但我怀疑:
让我们假设我有一个班级“洗衣”这个班级(仅为本例)3个属性:
laundryID
名称
垫圈
Id和Name是“原始”类型或简单类型(整数和字符串),但是Washers表示“Washer”类型的对象列表,它具有3个属性:
washerID
laundryID
容量
品牌
所有这些(对于此示例)简单/基元类型(整数,字符串,字符串)。
所以这就是我的困境,拥有像这样的构造函数(VB .net)
是正确的public sub new(ByVal laundryID as integer)
'' Here I'll query for the data of the Laundry on DB
'' After that I will query for every washer that belongs to this laundry
'' Then I will create a washer object for every row and add it to the
'' property "Washers" of the "Laundry"
end Sub
在构造函数内部查询属于洗衣店的所有洗衣机的id = laundryID参数,并创建“Washer”类型的对象并将它们添加到Laundry列表中?
我不确定如果我解释自己,任何评论我会非常感激,用更少的话来说,使用具有复杂属性的类/对象的正确方法(或良好实践)是什么(其他类/对象)。
我通常使用ADO.net,可能ADO / LINQ / Entity以透明的方式解决这个问题,但如果他们这样做我真的不知道。
注意:我熟悉VB.net,C#,PHP,所以如果你更喜欢解释/帮我使用带语法的例子,那没关系。
答案 0 :(得分:2)
在OOP世界中你有很多选择,我在这里包括两个:
这里的主要区别在于,如果您要加载1000个洗衣对象(比如在列表中显示它们),您将无法启动1000个单独的查询来加载其洗衣机。如果有人选择了洗衣店并向下钻取,则在您需要数据时会加载洗衣机。
Public Class Laundry
Private _laundryId As Integer
Private _name As String
Private _washers As List(Of Washer)
Public Sub New(ByVal LaundryId As Integer)
_laundryId = LaundryId
' option one - load them when the Laundry class loads
LoadWashers()
End Sub
Public ReadOnly Property Washers As List(Of Washer)
Get
If _washers Is Nothing Then
' option two - load them the first time the washers properties are referenced
LoadWashers()
End If
Return _washers
End Get
End Property
Private Sub LoadWashers()
_washers = New List(Of Washer)
' load the washers here
'...
'...
End Sub
End Class
答案 1 :(得分:1)
你的构造函数很好。你基本上说如果你有一个身份证号码,你只能制作一个洗衣舱,在这种情况下,如果LaundryID不是一个有效的身份证号码,你应该抛出一个例外。
我经常把像Washers列表这样的东西暴露为IEnumerable(Of Washer),这样我班级的消费者就无法自己控制列表。
这是一个简单的例子:
Public Class Laundry
Private _LaundryID As Integer
Private _LaundryName As String
Private _Washers As List(Of Washers)
Public Sub New(ByVal laundryID As Integer)
_LaundryID = laundryID
_Washers = New List(Of Washers)
'// populate washers
'// throw exception if something went wrong
End Sub
'// Properties
Public ReadOnly Property Washers As IEnumerable(Of Washer)
Get
Return _Washers
End Get
End Property
End Class
如何创建新的Laundry对象取决于您。它可能只是一个空构造函数,或者是一个Shared函数,它为您返回一个新的Laundry对象,其中包含来自数据库(或任何地方)的预先填充的ID号。