Я довольно много занимаюсь программированием Excel на VBA, но не очень много. объектно-ориентированный. Вот то, что время от времени всплывает, что меня беспокоит, и мне интересно, что-то мне не хватает.
В VBA, скажем, у меня есть класс C, определенный с некоторыми закрытыми членами, например:
'...
Private hidden1_ As Double
Private hidden2_ As Double
'...
Если бы VBA работал как C ++ или (большинство?) Других языков, поддерживающих ООП, я мог бы написать функцию-член для проверки равенства между экземплярами класса C следующим образом:
'Error: won't compile!
Public Function equal(cinst As C) As Boolean
equal = (hidden1_ = cinst.hidden1_ And hidden2_ = cinst.hidden2_)
End Function
Конечно, это не будет компилироваться в VBA, потому что функции-члены класса могут обращаться только к частным членам класса того же экземпляра, для которого они вызываются. Лучшее, что я когда-либо придумал для такого рода вещей, - это вместо этого определить две функции-члены, подобные этой:
Public Function equalDef(hidden1 As Double, hidden2 As Double) As Boolean
equalDef = (hidden1_ = hidden1 And hidden2_ = hidden2)
End Function
Public Function equal(cinst As C) As Boolean
equal = cinst.equalDef(hidden1_, hidden2_)
End Function
Это громоздко и раскрывает знания о существовании частных членов класса, но, по крайней мере, позволяет избежать фактического раскрытия значения частных членов класса.
Это лучшее, что я могу сделать?
РЕДАКТИРОВАТЬ:
Как обычно, после ответа я нашел лучший способ сформулировать вопрос. Он был озаглавлен «Есть ли более чистый способ написать тест на равенство для класса VBA с закрытыми членами?» когда Дик ответил на него.