【问题标题】:Variable that automatically updates when another property is updated更新另一个属性时自动更新的变量
【发布时间】:2017-09-28 20:57:15
【问题描述】:

我确信这是一件非常简单的事情,只是我根本不了解属性/变量。我希望类有一个在输入一些属性值后分配/计算的变量。这不是作业,我只是在使用一个简化的示例。

Public Class person

    Public Property name As String
    Public Property address As String
    Public phoneNumber As String

    Public Sub getPhoneNumber()
        phoneNumber = lookLookThemUpInThePhoneBook
    End Sub

End Class

当他们被创建时我可能不知道他们的姓名和地址,但是一旦他们都被分配,我想要计算电话号码。

我知道我可以做到

Dim Eddy As New person

Eddy.name = "Ed Wood"
Eddy.address = "123 Sample Road"
Eddy.getPhoneNumber()

Debug.Print(Eddy.phoneNumber)

但是必须手动运行该过程会变得非常麻烦,所以我认为必须有一种方法可以主动分配该值。

我希望能够做到这一点

Eddy.name = "Ed Wood"
Eddy.address = "123 Sample Road"
Debug.Print(Eddy.phoneNumber) ' His phone number is just automatically looked up.

【问题讨论】:

  • 您可以在属性设置器中包含逻辑...该属性通常是只读的,因此只能通过您的代码进行设置

标签: vb.net visual-studio-2010 oop


【解决方案1】:

您可以延迟电话号码查找,直到 phoneNumber 属性被引用,方法是在该属性的设置器中实现该逻辑(如 cmets 中所述)。这是一个例子:

Public ReadOnly Property phoneNumber As String
    Get
        'Leverage a class level private variable and wrap in an
        'If Statement if you only want To look it up once.
        Return lookLookThemUpInThePhoneBook()
    End Get
End Property

然后,当您执行 objYourPerson.phoneNumber 时,它会为您查找。

【讨论】:

    【解决方案2】:

    Name和Address属性都可以在修改时尝试设置电话号码

    Public Class Person
        Private _name As String = ""
        Private _address As String = ""
        Private _phoneNumber As String = "not set yet..."
        Public Property Name As String
            Get
                Return _name
            End Get
            Set(value As String)
                _name = value
                setPhoneNumber()
            End Set
        End Property
        Public Property Address As String
            Get
                Return _address
            End Get
            Set(value As String)
                _address = value
                setPhoneNumber()
            End Set
        End Property
        Public Property PhoneNumber As String
            Get
                Return _phoneNumber
            End Get
            Private Set(value As String)
                _phoneNumber = value
            End Set
        End Property
        Public Sub setPhoneNumber()
            If Name <> "" AndAlso Address <> "" Then PhoneNumber = lookThemUpInThePhoneBook(Name, Address)
        End Sub
        Private Function lookThemUpInThePhoneBook(name As String, address As String) As String
            Return "123456789" ' search by name and address here
        End Function
    End Class
    

    用法:

    Sub Main()
        Dim Eddy As New Person()
        Eddy.Name = "Ed Wood"
        Console.WriteLine(Eddy.PhoneNumber)
        Eddy.Address = "123 Sample Road"
        Console.WriteLine(Eddy.PhoneNumber)
        Console.ReadLine()
    End Sub
    

    输出

    尚未设置...
    123456789

    【讨论】:

      【解决方案3】:

      这样的……

      Public Class Person
          Public Sub New(strname As String, straddress As String)
               name = strname
               address = straddress
               _phoneNumber = LookThemUpInThePhoneBook(strname, straddress)
          End Sub
      
          Private Function LookThemUpInThePhoneBook(pName As String, pAddress As String) As String
              Dim myPhone As String = ""
              'Do work to look up phone number
              Return myPhone
          End Function
      
          Private _phoneNumber As String
          Public ReadOnly Property phoneNumber As String
              Get
                  Return _phoneNumber
              End Get
          End Property
      
          Private _name As String
          Public Property name As String
              Get
                  Return _name
              End Get
              Set(value As String)
                  _name = value
              End Set
          End Property
      
          Private _address As String
          Public Property address As String
              Get
                  Return _address
              End Get
              Set(value As String)
                  _address = value
              End Set
          End Property
      
      End Class
      

      然后

      Dim Eddy As New Person("Eddy wood", "123 Sample Road")
      Debug.Print(Eddy.phoneNumber)
      

      【讨论】:

        猜你喜欢
        • 2019-05-02
        • 2020-02-21
        • 2017-04-24
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 2020-03-05
        • 2022-06-10
        相关资源
        最近更新 更多