Simular herencia de clases ?

Iniciado por arfgh, 29 Julio 2013, 21:03 PM

0 Miembros y 1 Visitante están viendo este tema.

arfgh

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

eferion

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.

Danyfirex

creo que no has leído nada en las dos paginas que citaste. :S

arfgh

si que lo he leído, pero no entiendo por qué dicen 'simular' cuando en realidad se logra un comportamiento idéntico o similar.

eferion

Cita de: 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.

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

Danyfirex

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

arfgh

pues yo veo el comportamiento idéntico, o sea que señalad en dónde no lo és.

Danyfirex



@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

eferion

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 (cpp) [Seleccionar]

class Animal
{
  public:
    virtual void Nombre( )
    {  std::cout << "Animal" << std::endl; }
};

class Perro : public Animal
{
  public:
    void Nombre( );
    {  std::cout << "Perro" << std::endl; }
};


class Gato: public Animal
{
  public:
    void Nombre( );
    {  std::cout << "Gato" << std::endl; }
};

void main ( )
{
  // Creo tres clases de forma dinamica y almaceno sus instancias en punteros de tipo de la clase base
  // Esto en vb directamente no puedes hacerlo.
  Animal* animal1 = new Animal( );
  Animal* animal2 = new Perro( );
  Animal* animal3 = new Gato( );

  // Saca por pantalla lo siguiente:
  // Animal
  // Perro
  // Gato
  animal1->Nombre( );
  animal2->Nombre( );
  animal3->Nombre( );

  // Le pregunto a las 3 instancias si son del tipo Perro
  Perro* perro1 = dynamic_cast< Perro* >( animal1 ); // devuelve un puntero nulo, pues no es de tipo Perro.
  Perro* perro2 = dynamic_cast< Perro* >( animal2 ); // devuelve un puntero valido.
  Perro* perro3 = dynamic_cast< Perro* >( animal3 ); // devuelve un puntero nulo.

  // ... Podria hacer lo mismo con la clase Gato ...

  // ... Si por ejemplo gato heredase de perro, la instruccion siguiente devolveria un puntero valido
  Perro* perro3 = dynamic_cast< Perro* >( animal3 );


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

raul338

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...