Jak używać metod porównywania modułów obiektów klasy w VBA w podobny sposób jak VB.NET?
W związku z nowym projektem w VBA przeniosłem się z VB.NET, szczerze mówiąc nie bardzo wiem, jak radzić sobie między klasami obiektów tutaj. To, co chcę osiągnąć, to porównywanie obiektów między różnymi modułami obiektów klasy.
E. g
Pracownik Klasy
właściwości: Name
, Age
chodzi o to, aby porównać Name
S pomiędzy dwoma pracownikami
Klasy: pracownik i Menedżer
punkt: porównaj Name
z pracownika z Name
z Manager
Wiem jak w VB.NET, ale jak porównać właściwości różnych obiektów modułu klas w VBA?
1 answers
VBA nie obsługuje polimorfizmu klas więc polecam zmienić sposób myślenia o Employee
oraz Manager
klasy.
Nie możesz mieć Employee
Klasa jako klasa bazowa, a następnie oddzielna Manager
klasa, która wywodzi Z Employee
. Mogą to być 2 oddzielne klasy implementujące wspólny interfejs.
Opowiem o tym szczegółowo za chwilę. Przejdźmy teraz przez kilka przykładów...
↓ łatwe podejście ↓
a
base
klasa (Person
) i klas potomnych, które wywodzą się z klasy podstawowej. (dotyczy C#, VB.NET, etc )
ale w VBA trzeba o tym myśleć tak:
Klasa bazowa, która eksponuje właściwość enum opisującą pozycję.
Coś jak
Jest to najprostszy sposób, aby mieć Klasa eksponująca niektóre właściwości. Pozwala na dodanie swojego Person
obiektów do kolekcji i iteracji za pomocą łatwego for each
pętla z Intellisense!
System porównywania właściwości byłby bardzo prosty
uwaga: to samo odnosi się do enum, ponieważ jego implicite przekształca się w liczbę
↓ bardziej złożone podejście ↓
Dwie oddzielne klasy, które obie ujawniają nieruchomości publiczne. Na przykład masz Employee
oraz Manager
klasy, które zarówno realizują Person
interfejs oraz dodatkowe Comparer
Klasa A Compare()
metoda
W projekcie VBA potrzebujesz 4 modułów klasowych i standardowego modułu
Person
(To jest Twój interfejs)
Public Property Get Name() As String
End Property
Public Property Get Age() As Long
End Property
ta klasa jest interfejsem, który zarówno Employee
jak i Manager
oba muszą zaimplementować, aby współdzielić niektóre wspólne funkcje (gettery dla nazw i wieku). Posiadanie interfejsu pozwala na wykonanie dla każdej pętli przy użyciu zmiennej typu interface jako wyliczenia. Zobaczysz za chwilę .
Employee
oraz Manager
są identyczne. Oczywiście możesz je zmodyfikować, aby pasowały do twojego prawdziwego rozwiązania.
Implements Person
Private name_ As String
Private age_ As Long
Public Property Get Name() As String
Name = name_
End Property
Public Property Let Name(ByVal Value As String)
name_ = Value
End Property
Public Property Get Age() As Long
Age = age_
End Property
Public Property Let Age(ByVal Value As Long)
age_ = Value
End Property
Private Property Get Person_Name() As String
Person_Name = Name
End Property
Private Property Get Person_Age() As Long
Person_Age = Age
End Property
ComparerCls
użyjesz instancji tej klasy do porównania dwóch właściwości obiektów lub referencje . Niekoniecznie musisz mieć do tego klasę, ale wolę, żeby tak było.
Public Enum ComparisonMethod
Names = 0 ' default
Ages = 1
References = 2
End Enum
' makes names the default comparison method
Public Function Compare(ByRef obj1 As Person, _
ByRef obj2 As Person, _
Optional method As ComparisonMethod = 0) _
As Boolean
Select Case method
Case Ages
Compare = IIf(obj1.Age = obj2.Age, True, False)
Case References
Compare = IIf(obj1 Is obj2, True, False)
Case Else
Compare = IIf(obj1.Name = obj2.Name, True, False)
End Select
End Function
I twoje Module1
kod
Option Explicit
Sub Main()
Dim emp As New Employee
emp.Name = "person"
emp.Age = 25
Dim man As New Manager
man.Name = "manager"
man.Age = 25
Dim People As New Collection
People.Add emp
People.Add man
Dim individual As Person
For Each individual In People
Debug.Print TypeName(individual), individual.Name, individual.Age
Next
End Sub
Uruchom Main()
sub i sprawdź wyniki w oknie
Najlepszą częścią powyższego kodu jest fakt, że tworzysz zmienną odniesienia o Person
interfejs. Pozwala na pętlę przez wszystkie elementy w kolekcji, które realizują interfejs. Możesz również użyć Intellisense, co jest świetne, jeśli masz o wiele więcej właściwości i funkcji.
Porównanie
Spójrz jeszcze raz na kod w klasie ComparerCls
Mam nadzieję, że teraz rozumiesz, dlaczego oddzieliłem to od klasy. Jego celem jest tylko dbanie o sposób porównywania obiektów. Możesz określić kolejność Enum i zmodyfikować samą metodę Compare()
, aby porównać ją w inny sposób. Uwaga na Opcjonalny parametr pozwalający na wywołanie metody porównywania bez metody porównywania.
Teraz możesz bawić się przekazywaniem różnych parametrów do funkcji porównywania. Zobacz jakie są wyniki.
Spróbuj kombinacji:
emp.Name = "name"
man.Name = "name"
Comparer.Compare(emp, name, Names)
Comparer.Compare(emp, name, References)
Comparer.Compare(emp, emp, References)
Jeśli coś jest nadal niejasne odnoszą się do ta odpowiedź o słowie kluczowym Implements
w VBA
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 02:39:50