2010-09-08 11 views
11

Por ejemplo, tengo clase A que implementa clase Bherencia VBA, análogo de la súper

--- clase A ----

implements B 
public sub B_do() 
end sub 

--class B ----

public sub do() 
end sub 

¿Cómo puedo llamar a do() desde A? (super.do()) Entonces, ¿cómo puedo definir una variable común para ambas clases? Ahora puedo heredan sólo funciones, sub y propiedades ...

añadido: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5a83d794-3da1-466a-83d3-5d2eb0a054b2 misma pregunta

ha añadido: No es posible compartir variable a través de la jerarquía se de clases. Debería implementar la propiedad (de la misma manera que las funciones).

Respuesta

19

La manera habitual de hacer esto en VBA es tener una contiene una instancia de B, así como tener una Implementar interfaz de B, y luego delegar las llamadas a la interfaz B de la A a la interna B.

Este es algo viejo, pero ver la Guía Visual Studio 6.0 del programador:

http://msdn.microsoft.com/en-us/library/aa716285(VS.60).aspx

Hay un capítulo sobre "The Many (Inter) Caras de la reutilización de código" que describe esta convención:

http://msdn.microsoft.com/en-us/library/aa240846(v=VS.60).aspx

La forma MS describe es:

Además de implementar abstractos las interfaces, se puede reutilizar el código de implementando la interfaz de una clase ordinaria , y luego selectivamente delegar a un oculto instancia de la clase .

Esto significa que la herencia de implementación requiere muchos métodos de delegación explícitos. Incluso hay un subtítulo en el capítulo: "¿Esto no es tedioso?". Sin embargo, otra razón por la programación orientada a objetos en VBA es un PITA (TM) ...

EDITAR que no caben en un comentario:

Para responder a la pregunta que usted plantea en su comentario, así, un A es a B. Cuando haces que A implementa la interfaz de B, básicamente estás diciendo que puedes tratar una instancia de A como si en realidad fuera de tipo B. En VBA, la forma en que lo haces es declarando una variable de tipo B, y luego ajustarlo a una instancia de A. VBA sabrá qué hacer cuando lo llamas como un B:

Dim usedAsB as B 
Dim anA as A 

Set anA = New A 
Set usedAsB = anA 'fine since A implements B 

usedAsB.something() 'will call B_something() defined in class A 

en cuanto a lo que se ve en el deb ug ventana, no sé por qué aparece de esa manera. Y en cuanto a la delegación forzada, no estoy seguro de lo que quieres decir. VBA automáticamente envía llamadas a la interfaz B a los métodos correctos en la clase A. Si se refiere a generar automáticamente el código para heredar la implementación de B de la manera descrita anteriormente, no hay nada como eso que yo sepa para VBA. Creo que las diversas versiones "profesionales" de VB6 podrían hacer eso, pero nunca he usado VB6, así que no sé.

+0

Gracias! ¿Conoces alguna fuente sobre instancias precisas de clases en VBA?En la depuración, veo que la clase A tiene un campo de Tipo B. Entonces, en algún lugar de Internet, encuentro que el objeto de tipo A es un objeto de tipo B (!), De hecho; con delegación forzada. – nikaan

+0

@Nikita, leería los otros capítulos de la Guía del programador que tratan sobre "programación con objetos". En cuanto a la otra pregunta, voy a editar mi respuesta, ya que probablemente no encajará en un comentario. Así que mira allí en unos minutos ... – jtolle