• Viernes 8 de Noviembre de 2024, 19:56

Autor Tema:  Dudas sobre polimorfismo  (Leído 919 veces)

xlxScorpioxlx

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Dudas sobre polimorfismo
« en: Martes 11 de Agosto de 2009, 05:51 »
0
Buenas señores, soy un programador Junior de Visual Basic .net, totalmente nuevo en el foro y un poco noob en lo que respecta las tecnologías .NET de Microsoft. Trabajo mayormente con Java, Javascript y PHP, así que lo poco que se de programación trato de aplicarlo a VB .NET.

Mi duda es la siguiente, estoy usando polimorfismo usando una clase abstracta que implementa una interfaz donde se definen los métodos generales de las clases que heredan la clase abstracta. Ahora, la duda que tengo, es que si los métodos que defino en las clases heredadas de la clase abstracta se pueden llamar los métodos nuevos que implemento.

Ejemplo, en la clase abstracta defino dos basicos:
Public MustInherit Class Abstracta : Implements Interfaz
Public Function darNombres as String
...
end function

Public Function darApellidos as string
...
end function
en class

La clase que hereda:

Public Class Hereda: Inherits Abstracta
public function darDIreccion as string
...
end function

Ahora, son varias las clases que heredan de la clase abstracta, así que para poder crearlas dentro de un sólo tipo en el programa las declaro como:

Private laClase as Interaz
laClase = new Abstracta
Ahora, mi duda es si es posible llamar los nuevos métodos declarados en las clases que heredan de la abstracta de alguna forma? o tengo que declarar todas las funciones en la intefaz, pero en aquellas clases que no usen esos métodos declararlos como "MustOverride"?

De antemano, muchísimas gracias por su ayuda.

xlxScorpioxlx

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Dudas sobre polimorfismo
« Respuesta #1 en: Jueves 8 de Octubre de 2009, 08:50 »
0
No. Te aclaro...

Talcomo lo tienes hecho, no podrás nunca llamarlo, porque estás creando instancias de la clase que implementa la clase abstracta (Interfaz)..., tal como indicas en el código:
Citar
Private laClase as Interfaz
laClase = new Abstracta
Si 'laclase' es una instancia de la clase  'Interfaz' sólo podrá invocar los métodos que pertenecen a dicha clase, además no admitirá que le asignes la clase 'abstracta', porque es de otro tipo.
Lo más parecido a lo que quieres que puedes hacer sería esto:
Código: Visual Basic
  1.  
  2.  
  3. private laclase as Hereda= new abstracta
  4. private otraclase as OtraHereda= new abstracta
  5.  
  6.  

Pero desde la clase sólo puedes llamar a los métodos definidos en su clase y a los métodos definidos de las clases que anida.
Para entender esto lo mejor es compararlos con cajas, imagina que la clase interfaz es una bola de cristal e imagina que la clase abstracta es una caja, metemos la bola en la caja... ahora creamos la clase hereda, sería parecido a meter una copia de la clase abstracta dentro de la clase hereda... pués bien al declarar un clase sólo podrá invocarse los métodos que hay dentro de la caja y a los métodos que hay dentro de las cajas que están dentro de la caja. Así una instancia de interfaz, sólo podrá invocar métodos de otra clase interfaz de ninguna otra. La clase abstracta podrá invocar métodos de la clase abstracta yde la interfaz, de ninfuna otra. La clase hereda sólo podrá invocar los métodos de su propia clase y de la clase abstracta y la clase interfaz. si has creado una nueva clase que hereda de abstracta (hereda2) la clase hereda 'no ve' los métodos específicos de esta clase hereda2.

De hecho:
*  una interfaz se crea precisamente para eso, para compartir métodos (etc..) se llaman igual, pero que luego cada uno hace una cosa distinta, en cambio...
* la herencia lo que permite es compartir métodos (etc...) que hacen exactamente lo mismo. La herencia se hace para que una clase amplía lo que realiza la clase heredada.
* Una instancia es una copia idéntica de la clase de la que se instancia y se diferencia de otra instancia sólo en los datos que en un momento dado pueda tener cada una.

p.d.: como ya hace tiempo que pusiste el mensaje lo dejo aquí, pero si necesitas más aclaraciones...
«Ma non troppo»
----> ModoVacaciones = False<----