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 Name
s 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?
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
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 !
El sistema de comparación de propiedades sería muy, muy fácil
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
En su proyecto de VBA necesita 4 módulos de clase y un módulo estándar
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
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
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.
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
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