【问题标题】:Better oop practice: arguments of the class functions更好的 oop 实践:类函数的参数
【发布时间】:2018-02-09 14:33:31
【问题描述】:

假设我有一个这样的类:它有一个namesurname 作为属性和一个msgboxes 数据的函数。我应该使用这个函数的第一个变体还是第二个?

Private name As String
Private surname As String

Function do_something_1() As String
     MsgBox("Hello, " & name & " " & surname)
     do_something_1 = name & " " & surname
End Function

Function do_something_2(name As String, surname As String) As String
     MsgBox("Hello, " & name & " " & surname)
     do_something_2 = name & " " & surname
End Function

如果是第二个函数,namesurname 参数是否会重载类属性?假设类属性是JohnGreen,而函数是用JackBlack 调用的,哪个会被msgboxed?

编辑:我知道在第一个版本中,属性也可以通过 getter 访问,但我不想在这里使用它。

【问题讨论】:

  • 你需要的是属性。
  • @cyboashu 什么意思?

标签: vba excel oop object


【解决方案1】:

这是代码与属性的外观(如 cmets 中所述)。该类名为clsHuman

Option Explicit

Private m_sName As String
Private m_sSurname As String

Public Property Get Name() As String

    Name = m_sName

End Property

Public Property Get Surname() As String

    Surname = m_sSurname

End Property

Public Property Let Surname(ByVal sNewValue As String)

    m_sSurname = sNewValue

End Property

Public Property Let Name(ByVal sNewValue As String)

    m_sName = sNewValue

End Property

Function do_something_1() As String

    MsgBox ("Hello, " & Name & " " & Surname)
    do_something_1 = Name & " " & Surname

End Function

Function do_something_2(myName As String, mySurname As String) As String

    MsgBox ("Hello, " & myName & " " & mySurname)
    do_something_2 = myName & " " & mySurname

End Function

一旦你有了这个类,你就可以从这样的模块中调用它:

Option Explicit

Public Sub TestMe()

    Dim objHuman As New clsHuman

    objHuman.Name = "Vit"
    objHuman.Surname = "yata"

    Debug.Print objHuman.do_something_1
    Debug.Print objHuman.do_something_2("V", "D")

End Sub

如您所见,do_something_1 显示带有类中对象名称的 msgbox,do_something_2 显示带有参数的 msgbox。

编辑: 关于这个问题: 假设类属性是 John 和 Green,而函数是用 Jack 和 Black 调用的,哪个会被 msgboxed? 答案是 Jack 和 Black。但属性将保留 John 和 Green。

【讨论】:

  • 为什么要在类中使用getter和setter?我来自java,不记得这是一个要求。如果有的话,我习惯于利用在所有类中可见的私有属性。无论如何,哪个变体 更好 - 带有属性/getter 或带有函数参数?你回答不回答那个。
  • @Ans - getter 和 setter 是封装。它是 OOP 的支柱之一,也可以在 Java 中使用 - tutorialspoint.com/java/java_encapsulation.htm。通常,根据您想要做什么,您可以使用这两个选项中的任何一个。但是,关于您从 Java 到 VBA,您可能正在期待函数重载。有点不同 - stackoverflow.com/questions/64436/…
  • 我曾经认为 getter 和 setter 仅供外部使用 - 访问类的私有属性。无论如何,这不是我的问题。而且我不会重载函数,我只想保留一个版本,只是不确定哪个更正确,更不容易出错。
猜你喜欢
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多