【问题标题】:Accessing a private field in class module访问类模块中的私有字段
【发布时间】:2014-10-31 14:55:07
【问题描述】:

我有这个简化的类模块 clXXX....

':: backing field
Private fTemplateBk As Excel.Workbook

':::::::::::::::::::::::::::
'::
':: constructor
Private Sub Class_Initialize()

End Sub

':::::::::::::::::::::::::::
'::
':: properties
Property Get TemplateBk() 'As Excel.Workbook '<< different error messages depending on if "As Excel.Workbook" is included or not
    TemplateBk = fTemplateBk
End Property

':::::::::::::::::::::::::::
'::
':: methods
Public Sub openTemplate()
    Set fTemplateBk = Excel.Workbooks.Open("\\xxx\yyy\zzz.xlsx")
End Sub

Public Sub someMethod()
    Me.TemplateBk.Sheets(1).Activate
End Sub

普通模块:

Sub control()

Dim x As clXXX
Set x = New clXXX
x.openTemplate
x.someMethod  '<<<<<<errors here

End Sub

我只想通过只读属性TemplateBk 使用me.TemplateBk. ... 之类的代码访问私有字段fTemplateBk。我该如何修改上述内容才能做到这一点?

【问题讨论】:

  • 在您的属性中缺少 Set 获取....
  • 另外,为什么要在类中使用属​​性?您已经有权访问成员字段。
  • @citizenkong - 使用属性与支持字段是一个很好的做法。例如见stackoverflow.com/questions/271318/…
  • @citizenkong 我相信在类的构造函数中,直接访问私有支持字段是公平的,但其他任何地方的好做法是使用 setter 和 getter。
  • @TimWilliams and whytheq:谢谢,我不知道。

标签: vba excel


【解决方案1】:

您需要公开该属性并且必须使用 Set 关键字。

检查下面的代码并确认它是否有效:

Private fTemplateBk As Excel.Workbook

Public Property Get TemplateBk() As Excel.Workbook 
    Set TemplateBk = fTemplateBk
End Property

【讨论】:

【解决方案2】:

您的 someMethod 应该使用私有字段 fTemplateBk,因为它是外部私有的,而不是内部私有的。

Public Sub someMethod()
    Me.fTemplateBk.Sheets(1).Activate
End Sub

如果您需要从外部使用该属性,则应在您的普通模块中使用:

Sub control()
    Dim x As clXXX
    Set x = New clXXX
    x.openTemplate
    x.TemplateBk.Sheets(1).Activate
End Sub

更新 1

如果您想保持代码不变,只需在 TemplateBk getter 中添加 SET,代码就可以工作。正如您在图片中看到的,我在此更改中使用了与您相同的代码,并且可以正常工作。

Property Get TemplateBk() 'As Excel.Workbook
    Set TemplateBk = fTemplateBk  'add the SET at the beggining
End Property

【讨论】:

  • 如问题中所述 - 我想通过属性TemplateBk 访问fTemplateBk 即使在内部 - 这是一个好习惯。我相信一般的OO 经验法则是在构建时只访问私有支持字段。
  • 正如其他人所说,您缺少 Set TemplateBk = fTemplateBk,之后它将起作用。我已经测试过了,没有错误。
  • 谢谢米格尔。您的代码不会出错,但您应该在 someMethod 中使用 Me.TemplateBk.Sheets(1).Activate,以便该类遵循最佳实践。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2014-02-09
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
相关资源
最近更新 更多