从另一个 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

这会编译成与第一个代码段、私有支持字段等完全相同的代码,但编写起来要容易得多。