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?

Author: Arie, 2013-11-09

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

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

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!

Tutaj wpisz opis obrazka

System porównywania właściwości byłby bardzo prosty

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka

W projekcie VBA potrzebujesz 4 modułów klasowych i standardowego modułu

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka

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.

Tutaj wpisz opis obrazka

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

 66
Author: nateAtwork,
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