Установить значение приватной переменной из другого класса - PullRequest
0 голосов
/ 15 января 2019

Итак, я написал два класса для учебного проекта, над которым я работаю, и сейчас я кое о чем думаю.

Вот классы:

Card:

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, который заполняет колоду при инициализации:

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

Что меня интересует, так это то, могу ли я сделать процедуры Setter в классе Card частными и сделать так, чтобы процедура Population могла выполнять свою работу?

Наличие этих установочных процедур в классе Card своего рода отрицает цель сделать сами переменные приватными.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы должны обязательно использовать свойства. Весь смысл свойств заключается в том, что они ведут себя как поля извне, то есть вы устанавливаете их напрямую так же, как поля, но они ведут себя как методы изнутри, то есть вы можете добавить дополнительный код, такой как вычисления, проверка и повышение События. Вы можете самостоятельно объявить закрытые поля поддержки и полностью реализовать свойство, например

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

Это компилируется точно в тот же код, что и первый фрагмент, частное поле поддержки и все, но вам гораздо проще писать.

0 голосов
/ 15 января 2019

Вы можете установить методы getter / setter на Private и разрешить создание объектов карты через конструктор. Это сделало бы свойства «устанавливаемыми» при инициализации из других классов, но не редактируемыми после создания объекта. Кажется, это имеет смысл для объекта «карточка», где значение и имя карточки вряд ли изменятся.

Пример конструктора для класса Card:

Public Sub New(_suit As String, _name As Object, _value as Byte)
    Suit = _suit
    Name = _name 
    Value = _value 
End Sub
...