Clases base, herencia y subclases

09/08/2006 - 14:01 por Hugo Gsell | Informe spam
Hola.
El tema que me aqueja hoy es:
tengo una clase B que hereda (Inherits) de una clase A.
Dentro de B existen subclases B1, B2, etc... donde necesito hacer
referencia a propiedades/metodos de la clase base
Si quito el nivel B1 funciona pero así como esta NO.


Public Class B
Inherits A
Sub New()
...
End Sub
Public Class B1
Public Function Funcion1deB1
'aquí debo hacer referencia a MYBASE.MiPropiedad
End Function
EndClass
EndClass

Hugo A. Gsell
Sgo del Estero
Argentina
 

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
09/08/2006 - 17:40 | Informe spam
"Hugo Gsell" escribió en el mensaje
news:e4$
Hola.
El tema que me aqueja hoy es:
tengo una clase B que hereda (Inherits) de una clase A.
Dentro de B existen subclases B1, B2, etc... donde necesito hacer
referencia a propiedades/metodos de la clase base
Si quito el nivel B1 funciona pero así como esta NO.



Hola, Hugo:

Es chocante: uno diria que una subclase de una clase debería poder acceder
sin cualificacion a los miembros de la clase que la contiene.

El problema es que eso rompería con el principio del encapsulamiento
(independencia del contexto).
Por otra parte, puedes instanciar un objeto de una clase definida dentro de
otra clase sin pasar por una instancia de la clase "exterior", por ejemplo:

Public Class C1
Public Class C2
Public Sub Show()
Console.WriteLine("Soy una C2")
End Sub
End Class
End Class

Public Module MyModule
Sub Main
Dim c As New C1.C2
c.Show()
Console.ReadLine()
End Sub
End Module

En este caso, como puedes notar, existe una instancia de C2 que no está
subordinada ni relacionada de ninguna otra manera con ninguna instancia de
C1.

La unica solución es crear un constructor (Public Sub New(Base As
ClaseContenedora)) que inicialice una referencia a la instancia de la clase
que la contiene, y acceder a los miembros de la instancia contenedora
mediante esta referencia:

Public Class C1

Public i1 As Integer

Private Class C2
Private miBase As C1
Public Sub New(base As C1)
miBase = Base
End Sub

Public UnaFuncion() As Integer
Return miBase.i1 * miBase.i1
End Function
End Class

...

End Class

Si te parece un poco retorcido (lo es), busca una alternativa de diseño que
no uitilice clases anidadas.


Salud!

Preguntas similares