Cómo usar métodos de comparación entre módulos de objetos de clase en VBA de manera similar a VB.NET?


Debido al nuevo proyecto en VBA me mudé de VB.NET, para ser honesto realmente no sé cómo tratar entre las clases de objetos aquí. Lo que quiero alcanzar es comparar objetos entre diferentes módulos de objetos de clase.

E. g

Empleado de clase
     propiedades: Name, Age
     el punto es: comparar Names entre dos empleados

Clases: Empleado y Administrador de
el punto es: comparar Name de Empleado con Name de Manager

Sé cómo en VB.NET, pero ¿cómo comparo las propiedades de diferentes objetos de módulo de clase en VBA?

Author: Arie, 2013-11-09

1 answers

VBA no es compatible con polimorfismo de clase así que recomiendo cambiar la forma en que está pensando en el Employee y Manager clases.

Usted no puede tener una Employee clase de la clase base y, a continuación, separado Manager clase que deriva de Employee. Podrían ser 2 clases separadas implementando una interfaz común.

Voy a hablar de ello en detalle en un poco. Vamos a pasar por un pocos ejemplos...


↓ Enfoque fácil ↓


A base clase (Person) y clases secundarias que derivan de la clase base. ( se aplica a C#, VB.NET, etc )

pero en VBA tienes que pensar de esta manera:

Clase base que expone una propiedad enum que describe la posición.

Algo así como

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

Esta es la forma más fácil de tener un clase exponiendo algunas propiedades. Le permite agregar su Person objetos en una colección e iterar sobre el uso de la fácil for each loop con Intellisense !

introduzca la descripción de la imagen aquí

El sistema de comparación de propiedades sería muy, muy fácil

introduzca la descripción de la imagen aquí

nota: lo mismo se aplica a enum ya que se convierte implícitamente a un número


↓ enfoque Más complejo ↓


Dos clases separadas que exponen propiedades públicas. Por ejemplo, usted tiene un Employee y Manager clases que implementan un Person Interfaz y un Comparer clase exponiendo a Compare() método

introduzca la descripción de la imagen aquí

En su proyecto de VBA necesita 4 módulos de clase y un módulo estándar

introduzca la descripción de la imagen aquí

Person (esta es su Interfaz)

Public Property Get Name() As String
End Property

Public Property Get Age() As Long
End Property

esta clase es la interfaz que tanto el Employee y Manager ambos necesitan implementarse para compartir algunas funciones comunes (getters para Nombres y Edades). Tener la interfaz le permite hacer el para cada bucle utilizando la variable de tipo de interfaz como enumerador. Lo verás en un minuto.

Employee y Manager son idénticos. Obviamente puede modificarlos para adaptarse a su solución de la vida real.

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 usará una instancia de esta clase para comparar dos propiedades de objetos o referencias. No necesariamente necesitas tener una clase para esto, pero yo lo prefiero así.

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

Y su Module1 código

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

Ejecute el Main() sub y echa un vistazo a los resultados en la ventana inmediata

introduzca la descripción de la imagen aquí

La mejor parte del código anterior es el hecho de que está creando una variable de referencia de la Person interfaz. Permite recorrer todos los elementos de la colección que implementan el interfaz. También, puede utilizar el Intellisense que es grande si usted ha tenido muchas más propiedades y funciones.


Comparación


Eche un vistazo de nuevo al código en la clase ComparerCls

introduzca la descripción de la imagen aquí

Espero que vean ahora por qué he separado esto para ser una clase. Su propósito es solo cuidar la forma en que se comparan los objetos. Puede especificar el orden de enumeración y modificar el método Compare() para comparar de manera diferente. Nota la Parámetro opcional que le permite llamar al método de comparación sin el método de comparación.

introduzca la descripción de la imagen aquí

Ahora puede jugar pasando diferentes parámetros a la función comparar. Vea cómo son los resultados.

Prueba combinaciones:

emp.Name = "name"
man.Name = "name"

Comparer.Compare(emp, name, Names)
Comparer.Compare(emp, name, References)

Comparer.Compare(emp, emp, References)

Si algo aún no está claro, consulte esta respuesta sobre la palabra clave Implements en 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-11 02:39:50