从另一个 class 设置私有变量的值
Set value of private variable from another class
所以,我为我正在进行的练习项目写了两个 classes,有些事情我已经考虑了一段时间了。
这里是 classes:
卡片:
Public Class Card
Dim Suit As String
Dim Name As Object
Dim Value As Byte
Public Function GetSuit()
Return Suit
End Function
Public Function GetName()
Return Name
End Function
Public Function GetValue()
Return Value
End Function
Public Sub SetSuit(ByVal a)
Suit= a
End Sub
Public Sub SetName(ByVal a)
Name= a
End Sub
Public Sub SetValue(ByVal a)
Value= a
End Sub
End Class
以及由 Deck class 的构造函数调用的过程,该过程在初始化时填充 deck:
Private Sub Populate(ByVal Name As Object, ByVal Suit As String, ByRef Deck As List(Of Karta))
Dim NewCard As Card = New Card
New.SetSuit(Suit)
Select Case Name
Case 1
New.SetName("Ace")
New.SetValue(11)
Case 3
New.SetName(Name)
New.SetValue(10)
Case 11
New.SetName(Name)
New.SetValue(2)
Case 12
New.SetName(Name)
New.SetValue(3)
Case 13
New.SetName(Name)
New.SetValue(4)
Case Else
New.SetName(Name)
End Select
Deck.Add(New)
End Sub
我一直想知道的是,有没有什么办法可以让 Card class 中的 Setter 程序私有化,并且让 Population 程序仍然能够完成它的工作?
在 Card class 中包含那些 setter 过程有点违背了将变量本身设为私有的目的。
您可以将 getter/setter 方法设置为私有并允许通过构造函数创建卡片对象。这将使属性 "settable" 从其他 classes 初始化,但一旦创建对象就不可编辑。这对于 'card' 对象似乎是有意义的,其中卡片的值和名称不太可能改变。
Card 的示例构造函数 class:
Public Sub New(_suit As String, _name As Object, _value as Byte)
Suit = _suit
Name = _name
Value = _value
End Sub
您绝对应该使用属性。属性的全部意义在于它们从外部表现得像字段,即您直接以与设置字段相同的方式设置它们,但从内部表现得像方法,即您可以添加额外的代码,如计算、验证和提高事件。您可以自己声明私有支持字段并完全实现 属性,例如
Public Class Card
Private _suit As String
Public Property Suit As String
Get
Return _suit
End Get
Set
_suit = value
End Set
End Property
End Class
如您所见,属性 定义包含了 Get 和 Set 方法。当你编译时,Suit
属性 实际上变成了一个 get_Suit
方法和一个 set_Suit
方法。
如果您除了获取和设置支持字段之外不打算做任何事情,您可以使用自动 属性:
Public Class Card
Public Property Suit As String
End Class
这会编译成与第一个代码段、私有支持字段等完全相同的代码,但编写起来要容易得多。
所以,我为我正在进行的练习项目写了两个 classes,有些事情我已经考虑了一段时间了。
这里是 classes:
卡片:
Public Class Card
Dim Suit As String
Dim Name As Object
Dim Value As Byte
Public Function GetSuit()
Return Suit
End Function
Public Function GetName()
Return Name
End Function
Public Function GetValue()
Return Value
End Function
Public Sub SetSuit(ByVal a)
Suit= a
End Sub
Public Sub SetName(ByVal a)
Name= a
End Sub
Public Sub SetValue(ByVal a)
Value= a
End Sub
End Class
以及由 Deck class 的构造函数调用的过程,该过程在初始化时填充 deck:
Private Sub Populate(ByVal Name As Object, ByVal Suit As String, ByRef Deck As List(Of Karta))
Dim NewCard As Card = New Card
New.SetSuit(Suit)
Select Case Name
Case 1
New.SetName("Ace")
New.SetValue(11)
Case 3
New.SetName(Name)
New.SetValue(10)
Case 11
New.SetName(Name)
New.SetValue(2)
Case 12
New.SetName(Name)
New.SetValue(3)
Case 13
New.SetName(Name)
New.SetValue(4)
Case Else
New.SetName(Name)
End Select
Deck.Add(New)
End Sub
我一直想知道的是,有没有什么办法可以让 Card class 中的 Setter 程序私有化,并且让 Population 程序仍然能够完成它的工作?
在 Card class 中包含那些 setter 过程有点违背了将变量本身设为私有的目的。
您可以将 getter/setter 方法设置为私有并允许通过构造函数创建卡片对象。这将使属性 "settable" 从其他 classes 初始化,但一旦创建对象就不可编辑。这对于 'card' 对象似乎是有意义的,其中卡片的值和名称不太可能改变。
Card 的示例构造函数 class:
Public Sub New(_suit As String, _name As Object, _value as Byte)
Suit = _suit
Name = _name
Value = _value
End Sub
您绝对应该使用属性。属性的全部意义在于它们从外部表现得像字段,即您直接以与设置字段相同的方式设置它们,但从内部表现得像方法,即您可以添加额外的代码,如计算、验证和提高事件。您可以自己声明私有支持字段并完全实现 属性,例如
Public Class Card
Private _suit As String
Public Property Suit As String
Get
Return _suit
End Get
Set
_suit = value
End Set
End Property
End Class
如您所见,属性 定义包含了 Get 和 Set 方法。当你编译时,Suit
属性 实际上变成了一个 get_Suit
方法和一个 set_Suit
方法。
如果您除了获取和设置支持字段之外不打算做任何事情,您可以使用自动 属性:
Public Class Card
Public Property Suit As String
End Class
这会编译成与第一个代码段、私有支持字段等完全相同的代码,但编写起来要容易得多。