Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: arfgh en 29 Julio 2013, 21:03 pm



Título: Simular herencia de clases ?
Publicado por: arfgh en 29 Julio 2013, 21:03 pm
Hola

he leído por ahí que vb no proporciona herencia debido a que sus clases se basan en un modelo de interfaces y no de objetos. Sin embargo también he encontrado muchos ejemplos por ahí de como se 'simula' la herencia con vb.

por ejemplo:

http://vexpert.mvps.org/articles/SimHer.htm
http://www.elguille.info/VB/clases/herencia.htm

Mi pregunta es, por qué le llaman simular herencia cuando en realidad se consigue la citada herencia en los códigos que se muestran allí ?

A ver si alguien que controle de esto puede arrojar algo más de información acerca de estos detalles.

saludos


Título: Re: Simular herencia de clases ?
Publicado por: eferion en 31 Julio 2013, 17:36 pm
Imagina que tienes una clase animal y que de ella heredan las clases perro y gato.

Con herencia, tu podrías manejar las instancias de perro y gato como si fuesen elementos genéricos de la clase animal. Incluso, teniendo objetos de la clase animal, podrías preguntarle a cada uno si pertenecen a perro o a gato. Todo esto se conoce como polimorfismo. Esto te permite incorporar código que pueda trabajar indistintamente con perros o gatos sin preocuparse de su tipo concreto.

Con la herencia simulada que te proponen ahí la herencia como tal no existe y, en consecuencia, el polimorfismo tampoco. La clase perro no tiene nada en común con la clase gato. No puedes implementar lógica o funciones comunes para utilizar ambas clases. Son, simplemente, clases independientes.

Lo único que ganas con esto es que puedes reutilizar código subdividiendo las clases en otras más pequeñas según las necesidades comunes... pero no es herencia.


Título: Re: Simular herencia de clases ?
Publicado por: Danyfirex en 31 Julio 2013, 17:37 pm
creo que no has leído nada en las dos paginas que citaste. :S


Título: Re: Simular herencia de clases ?
Publicado por: arfgh en 31 Julio 2013, 21:24 pm
si que lo he leído, pero no entiendo por qué dicen 'simular' cuando en realidad se logra un comportamiento idéntico o similar.


Título: Re: Simular herencia de clases ?
Publicado por: eferion en 1 Agosto 2013, 00:11 am
si que lo he leído, pero no entiendo por qué dicen 'simular' cuando en realidad se logra un comportamiento idéntico o similar.

Efectivamente se dice simular porque el comportamiento es similar, no idéntico.


Título: Re: Simular herencia de clases ?
Publicado por: Danyfirex en 1 Agosto 2013, 00:26 am
efectivamente como dice eferion.


@arfgh si te fijas al comienzo de la pagina del Guille dice:

--Pero a pesar de todo lo que se diga, aunque te lo pinten de color de rosa, lo cierto es que Visual Basic no tiene herencia... con eso ya te das cuenta que lo que vas a hacer es simular.

saludos


Título: Re: Simular herencia de clases ?
Publicado por: arfgh en 1 Agosto 2013, 01:27 am
pues yo veo el comportamiento idéntico, o sea que señalad en dónde no lo és.


Título: Re: Simular herencia de clases ?
Publicado por: Danyfirex en 1 Agosto 2013, 01:40 am


@arfgh Si digamos que el comportamiento se acerca, es muy similar.  pero según Microsoft:


Visual Basic 6.0 does not support implementation inheritance.

simplemente por eso se simula. así sea idéntica como dices se esta simulando.


saludos


Título: Re: Simular herencia de clases ?
Publicado por: eferion en 1 Agosto 2013, 07:12 am
Mira, te pongo un ejemplo de herencia, en c++... ya que en vb esto que te voy a poner no se puede hacer.

Código
  1. class Animal
  2. {
  3.  public:
  4.    virtual void Nombre( )
  5.    {  std::cout << "Animal" << std::endl; }
  6. };
  7.  
  8. class Perro : public Animal
  9. {
  10.  public:
  11.    void Nombre( );
  12.    {  std::cout << "Perro" << std::endl; }
  13. };
  14.  
  15.  
  16. class Gato: public Animal
  17. {
  18.  public:
  19.    void Nombre( );
  20.    {  std::cout << "Gato" << std::endl; }
  21. };
  22.  
  23. void main ( )
  24. {
  25.  // Creo tres clases de forma dinamica y almaceno sus instancias en punteros de tipo de la clase base
  26.  // Esto en vb directamente no puedes hacerlo.
  27.  Animal* animal1 = new Animal( );
  28.  Animal* animal2 = new Perro( );
  29.  Animal* animal3 = new Gato( );
  30.  
  31.  // Saca por pantalla lo siguiente:
  32.  // Animal
  33.  // Perro
  34.  // Gato
  35.  animal1->Nombre( );
  36.  animal2->Nombre( );
  37.  animal3->Nombre( );
  38.  
  39.  // Le pregunto a las 3 instancias si son del tipo Perro
  40.  Perro* perro1 = dynamic_cast< Perro* >( animal1 ); // devuelve un puntero nulo, pues no es de tipo Perro.
  41.  Perro* perro2 = dynamic_cast< Perro* >( animal2 ); // devuelve un puntero valido.
  42.  Perro* perro3 = dynamic_cast< Perro* >( animal3 ); // devuelve un puntero nulo.
  43.  
  44.  // ... Podria hacer lo mismo con la clase Gato ...
  45.  
  46.  // ... Si por ejemplo gato heredase de perro, la instruccion siguiente devolveria un puntero valido
  47.  Perro* perro3 = dynamic_cast< Perro* >( animal3 );

Esto es herencia... y en vb no lo puedes hacer.


Título: Re: Simular herencia de clases ?
Publicado por: raul338 en 1 Agosto 2013, 21:23 pm
Depende de QUE tomes como conpecto de herencia, ya de que por si sola no te sirve nada...

La herencia debe ir en conjunto con el Polimorfismo y es ahí donde esta la "falla", solo se puede lograr herencia simple por interfaces (2º link) y tener algo de polimorfismo, o se puede hacer todo a mano y evitando errores pero perdés toda forma de hacer polimorfismo (1º link) (lo cual lo hace inutil)

Lo que no podes hacer es polimorfismo con herencia de clases CON CODIGO (que la clase base tenga codigo) ni herencia a más clases y a la vez tener el lujo de polimorfismo.
Intenta hacer algo así:
Animal
  -Insectos
    -Mosca
  -Mamiferos
    -Perro
    -Gato


Quizás Animal puede ser interfaz, pero que los demas sean clases que sean instanciables y se rompe la teoria...


Título: Re: Simular herencia de clases ?
Publicado por: arfgh en 2 Agosto 2013, 16:41 pm
es complejo el tema, por lo que veo..


Título: Re: Simular herencia de clases ?
Publicado por: 79137913 en 2 Agosto 2013, 18:22 pm
HOLA!!!

Si, es dificil el tema...

En fin que es lo que queres hacer, talves no es necesaria herencia.

Explicanos.

GRACIAS POR LEER!!!


Título: Re: Simular herencia de clases ?
Publicado por: BlackZeroX en 2 Agosto 2013, 19:14 pm
pues yo veo el comportamiento idéntico, o sea que señalad en dónde no lo és.

Cuando es herencia NO instancias varias clases bases (No de la manera en la que se ve en el código interno de vb)... en esta simulación se instancia la clase base Carnívoro dentro e las otras clases...

En C++ la herencia es:

Código
  1. class carnivoro {
  2. ...
  3. }
  4.  
  5. class gato : [public|private] carnivoro {
  6.  ...
  7. }
  8.  

Dulces Lunas!¡.