Herencia

26/01/2007 - 21:21 por Francesc | Informe spam
Ya no se que hacer con el error que me da :S

using System;
using System.Collections.Generic;
using System.Text;

namespace Herencia
{
class prog
{

public class Animal
{
//CLASSE PADRE

private string color;

public Animal()
{
color = "Azul";
}

public virtual void HacerSonido()
{
//PONEMOS EL VIRTUAL PARA QUE SE PUEDA CREAR UN NUEVO OBJETO
DE HACER SONIDO
//CON LA PALABRA NEW
Console.Out.WriteLine("???");
}

public string Color
{
get { return color; }
//EL VALUE COJER EL VALOR ASIGNADO EN OTRA CLASE HIJA
set { color = value; }
}
}

public class Gato : Animal
{
//BASE PARA COJER LA ANTERIOR CLASSE
public Gato()
{
Color = "Negro";
}

public new void HacerSonido()
{
Console.Out.WriteLine("MEOOW");
}
}

public class Leon : Gato
{
//EN BASE A LA CLASSE ANTERIOR
public Leon()
{
Color = "Amarillo";
}

public new void HacerSonido()
{
Console.Out.WriteLine("ROOOWR");
}
}

public class Reyleon : Leon
{

public Reyleon() : base()
{
Color = "Amarillo y Negro";
}

public override void HacerSonido()
{
Console.Out.WriteLine("Gran Rugido");
}

}

static void Main(string[] args)
{
Gato g = new Gato();
g.HacerSonido();


Leon l = new Leon();
l.HacerSonido();

Gato poliGato = new Gato();
poliGato.HacerSonido();

Reyleon RL = new Reyleon();
RL.HacerSonido();

Leon poliLeon = (Leon)RL;
poliLeon.HacerSonido();

poliGato = (Gato)RL;
poliGato.HacerSonido();

string tecla = Console.ReadLine();
}
}
}

Y me da este error:
'Herencia.prog.Reyleon.HacerSonido()': no puede reemplazar el miembro
heredado 'Herencia.prog.Leon.HacerSonido()' porque no está marcado como
virtual, abstract u override

Pero el tema es que en la classe padre esta con virtual...

Alguien puede ayudarme??

Thanks!
Francesc Jaumot
España (Lérdia)

Preguntas similare

Leer las respuestas

#1 RFOG
26/01/2007 - 21:39 | Informe spam
Está bien claro:

tienes que poner "virtual" en esos mismos métodos, para conservar las
vtable (o lo que quiera que tenga el C# en su lugar).

Si quieres que el método sea nuevo y se rompa la cadena virtual, tienes
que poner override.


Francesc wrote :
Ya no se que hacer con el error que me da :S

using System;
using System.Collections.Generic;
using System.Text;

namespace Herencia
{
class prog
{

public class Animal
{
//CLASSE PADRE

private string color;

public Animal()
{
color = "Azul";
}

public virtual void HacerSonido()
{
//PONEMOS EL VIRTUAL PARA QUE SE PUEDA CREAR UN NUEVO OBJETO
DE HACER SONIDO
//CON LA PALABRA NEW
Console.Out.WriteLine("???");
}

public string Color
{
get { return color; }
//EL VALUE COJER EL VALOR ASIGNADO EN OTRA CLASE HIJA
set { color = value; }
}
}

public class Gato : Animal
{
//BASE PARA COJER LA ANTERIOR CLASSE
public Gato()
{
Color = "Negro";
}

public new void HacerSonido()
{
Console.Out.WriteLine("MEOOW");
}
}

public class Leon : Gato
{
//EN BASE A LA CLASSE ANTERIOR
public Leon()
{
Color = "Amarillo";
}

public new void HacerSonido()
{
Console.Out.WriteLine("ROOOWR");
}
}

public class Reyleon : Leon
{

public Reyleon() : base()
{
Color = "Amarillo y Negro";
}

public override void HacerSonido()
{
Console.Out.WriteLine("Gran Rugido");
}

}

static void Main(string[] args)
{
Gato g = new Gato();
g.HacerSonido();


Leon l = new Leon();
l.HacerSonido();

Gato poliGato = new Gato();
poliGato.HacerSonido();

Reyleon RL = new Reyleon();
RL.HacerSonido();

Leon poliLeon = (Leon)RL;
poliLeon.HacerSonido();

poliGato = (Gato)RL;
poliGato.HacerSonido();

string tecla = Console.ReadLine();
}
}
}

Y me da este error:
'Herencia.prog.Reyleon.HacerSonido()': no puede reemplazar el miembro
heredado 'Herencia.prog.Leon.HacerSonido()' porque no está marcado como
virtual, abstract u override

Pero el tema es que en la classe padre esta con virtual...

Alguien puede ayudarme??

Thanks!



Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Respuesta Responder a este mensaje
#2 Francesc
26/01/2007 - 21:53 | Informe spam
Ok, pero entonces me da este aviso:

Advertencia 1 'Herencia.prog.Leon.HacerSonido()' oculta el miembro heredado
'Herencia.prog.Gato.HacerSonido()'. Utilice la nueva palabra clave si su
intención era ocultarlo.

:S

Alguien me puede decir la utilización real de la herencia/polimorfismo? Es
que no le acabo de ver la utilidad...
Francesc Jaumot
España (Lérdia)


"RFOG" wrote:

Está bien claro:

tienes que poner "virtual" en esos mismos métodos, para conservar las
vtable (o lo que quiera que tenga el C# en su lugar).

Si quieres que el método sea nuevo y se rompa la cadena virtual, tienes
que poner override.


Francesc wrote :
> Ya no se que hacer con el error que me da :S
>
> using System;
> using System.Collections.Generic;
> using System.Text;
>
> namespace Herencia
> {
> class prog
> {
>
> public class Animal
> {
> //CLASSE PADRE
>
> private string color;
>
> public Animal()
> {
> color = "Azul";
> }
>
> public virtual void HacerSonido()
> {
> //PONEMOS EL VIRTUAL PARA QUE SE PUEDA CREAR UN NUEVO OBJETO
> DE HACER SONIDO
> //CON LA PALABRA NEW
> Console.Out.WriteLine("???");
> }
>
> public string Color
> {
> get { return color; }
> //EL VALUE COJER EL VALOR ASIGNADO EN OTRA CLASE HIJA
> set { color = value; }
> }
> }
>
> public class Gato : Animal
> {
> //BASE PARA COJER LA ANTERIOR CLASSE
> public Gato()
> {
> Color = "Negro";
> }
>
> public new void HacerSonido()
> {
> Console.Out.WriteLine("MEOOW");
> }
> }
>
> public class Leon : Gato
> {
> //EN BASE A LA CLASSE ANTERIOR
> public Leon()
> {
> Color = "Amarillo";
> }
>
> public new void HacerSonido()
> {
> Console.Out.WriteLine("ROOOWR");
> }
> }
>
> public class Reyleon : Leon
> {
>
> public Reyleon() : base()
> {
> Color = "Amarillo y Negro";
> }
>
> public override void HacerSonido()
> {
> Console.Out.WriteLine("Gran Rugido");
> }
>
> }
>
> static void Main(string[] args)
> {
> Gato g = new Gato();
> g.HacerSonido();
>
>
> Leon l = new Leon();
> l.HacerSonido();
>
> Gato poliGato = new Gato();
> poliGato.HacerSonido();
>
> Reyleon RL = new Reyleon();
> RL.HacerSonido();
>
> Leon poliLeon = (Leon)RL;
> poliLeon.HacerSonido();
>
> poliGato = (Gato)RL;
> poliGato.HacerSonido();
>
> string tecla = Console.ReadLine();
> }
> }
> }
>
> Y me da este error:
> 'Herencia.prog.Reyleon.HacerSonido()': no puede reemplazar el miembro
> heredado 'Herencia.prog.Leon.HacerSonido()' porque no está marcado como
> virtual, abstract u override
>
> Pero el tema es que en la classe padre esta con virtual...
>
> Alguien puede ayudarme??
>
> Thanks!

Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación



Respuesta Responder a este mensaje
#3 RFOG
26/01/2007 - 22:17 | Informe spam
aissss. No lo recuerdo... Pero le tienes que decir qué quieres
exactamente (creo que con new, pero no me hagas mucho caso).

El polimorfismo (entendido como herencia virtual, o como quiera que se
llame es muy útil). Además, tu mismo estás haciéndolo.

Imagina tu jerarquía de clases. En tiempo de diseño sabes qué cosa es
cada clase, pero en tiempo de ejecución podrías tener esto:

Animal gato=new Gato();

gato.HacerSonido(); maullaría en lugar de imprimir ???.

Ahora imagina un universo de animales que interactuen entre sí, y que
sea el usuario quien los instancie según su voluntad mediante un menú.

Tendrías un array de Animales:

Animal[] animales=new Animal[55];

y luego en cada opción adecuada del menú, harías:

animales[elquemetoca++]=new Gato();

en otra opción

animales[elquemetoca++]=new Perro();

y en otra más:

animales[elquemetoca++]=new ElefanteRosa();

Luego tu motor que los hace sonar, funcionaría así:

for(int i=0;i<elquemetoca;i++)
animales[i].HacerSonido();

sin preocuparte de si es un perro, un gato o un sinseñorsinpatas.

Digamos que te permite manejar objetos de un tipo que realmente son
instancias de tipos derivados en tiempo de ejecución sin saber en
tiempo de diseño de qué tipo se trata.

Se usa mucho en interfaces de usuario (y otras aplicaciones de
sistema), pero para bases de datos y cosas así no tienen mucho sentido.


Francesc presented the following explanation :
Ok, pero entonces me da este aviso:

Advertencia 1 'Herencia.prog.Leon.HacerSonido()' oculta el miembro heredado
'Herencia.prog.Gato.HacerSonido()'. Utilice la nueva palabra clave si su
intención era ocultarlo.

S



Alguien me puede decir la utilización real de la herencia/polimorfismo? Es
que no le acabo de ver la utilidad...
Francesc Jaumot
España (Lérdia)


"RFOG" wrote:

Está bien claro:

tienes que poner "virtual" en esos mismos métodos, para conservar las
vtable (o lo que quiera que tenga el C# en su lugar).

Si quieres que el método sea nuevo y se rompa la cadena virtual, tienes
que poner override.


Francesc wrote :
Ya no se que hacer con el error que me da :S

using System;
using System.Collections.Generic;
using System.Text;

namespace Herencia
{
class prog
{

public class Animal
{
//CLASSE PADRE

private string color;

public Animal()
{
color = "Azul";
}

public virtual void HacerSonido()
{
//PONEMOS EL VIRTUAL PARA QUE SE PUEDA CREAR UN NUEVO
OBJETO DE HACER SONIDO
//CON LA PALABRA NEW
Console.Out.WriteLine("???");
}

public string Color
{
get { return color; }
//EL VALUE COJER EL VALOR ASIGNADO EN OTRA CLASE HIJA
set { color = value; }
}
}

public class Gato : Animal
{
//BASE PARA COJER LA ANTERIOR CLASSE
public Gato()
{
Color = "Negro";
}

public new void HacerSonido()
{
Console.Out.WriteLine("MEOOW");
}
}

public class Leon : Gato
{
//EN BASE A LA CLASSE ANTERIOR
public Leon()
{
Color = "Amarillo";
}

public new void HacerSonido()
{
Console.Out.WriteLine("ROOOWR");
}
}

public class Reyleon : Leon
{

public Reyleon() : base()
{
Color = "Amarillo y Negro";
}

public override void HacerSonido()
{
Console.Out.WriteLine("Gran Rugido");
}

}

static void Main(string[] args)
{
Gato g = new Gato();
g.HacerSonido();


Leon l = new Leon();
l.HacerSonido();

Gato poliGato = new Gato();
poliGato.HacerSonido();

Reyleon RL = new Reyleon();
RL.HacerSonido();

Leon poliLeon = (Leon)RL;
poliLeon.HacerSonido();

poliGato = (Gato)RL;
poliGato.HacerSonido();

string tecla = Console.ReadLine();
}
}
}

Y me da este error:
'Herencia.prog.Reyleon.HacerSonido()': no puede reemplazar el miembro
heredado 'Herencia.prog.Leon.HacerSonido()' porque no está marcado como
virtual, abstract u override

Pero el tema es que en la classe padre esta con virtual...

Alguien puede ayudarme??

Thanks!



Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación








Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Respuesta Responder a este mensaje
#4 Octavio Hernandez
27/01/2007 - 00:21 | Informe spam
Cesc,

Ok, pero entonces me da este aviso:

Advertencia 1 'Herencia.prog.Leon.HacerSonido()' oculta el miembro
heredado
'Herencia.prog.Gato.HacerSonido()'. Utilice la nueva palabra clave si su
intención era ocultarlo.



Claro, porque en la clase Leon has usado "new" en vez de "override", con lo
que
has roto la cadena de redefinición virtual. Debes cambiarlo, y de paso el de
la
clase Gato también.

En general, el uso de "new" es muy poco común, de hecho existe de toda la
vida
en C++ que dice "once virtual, always virtual", en el sentido de q cuando se
define
un método virtual, es para redefinirle (override) en toda la jerarquía de
clases
derivadas, para aprovechar así el polimorfismo.

El polimorfismo es tremendamente útil, pues permite que una llamada a método
se
resuelva no según el tipo estático de una variable, sino según el tipo real
del objeto
al que esa variable apunta. Por ejemplo, si en tu caso haces (después de
arreglar
Leon y Gato :-)

Animal a = new Leon();
a.HacerSonido(); // el método de Leon, pq a hace referencia a un león

se ejecutará el método HacerSonido de Leon y no el de Animal. Más adelante
podrás hacer:

Animal a = new Gato(); // la misma variable en principio
a.HacerSonido(); // el método de Gato, pq ahora a hace referencia a un
gato

Si HacerSonido no fuera virtual, el compilador resolvería estáticamente
ambas
llamadas al método HacerSonido() de la clase Animal, y se perdería toda la
gracia :-)

Fíjate si el polimorfismo es importante para la POO, que en algunos
lenguajes
como Java *TODOS* los métodos son virtuales, sin ninguna otra opción.

Slds - Octavio
Respuesta Responder a este mensaje
#5 Francesc
29/01/2007 - 13:53 | Informe spam
Gracias a ambos! ;) mas claro me ha quedado y efectivamene tenia que poner
virtual en gato para que funcionase bien, si no rompo la cadena y me imprimia
mal el sonido...

Lo que pasa es que herencia y polimorfismo me lo han explicado como unas 3 o
4 veces en varios lenguajes ( los que he estudiado ) pero nunca cojia el
porque hasta que digo, pues no voy a ver al 100% que es lo que puedo hacer,
como puedo utilizarlo en mi tiempo real...

Así que gracias! ;)
Francesc Jaumot
España (Lérdia)


"Octavio Hernandez" wrote:

Cesc,

> Ok, pero entonces me da este aviso:
>
> Advertencia 1 'Herencia.prog.Leon.HacerSonido()' oculta el miembro
> heredado
> 'Herencia.prog.Gato.HacerSonido()'. Utilice la nueva palabra clave si su
> intención era ocultarlo.

Claro, porque en la clase Leon has usado "new" en vez de "override", con lo
que
has roto la cadena de redefinición virtual. Debes cambiarlo, y de paso el de
la
clase Gato también.

En general, el uso de "new" es muy poco común, de hecho existe de toda la
vida
en C++ que dice "once virtual, always virtual", en el sentido de q cuando se
define
un método virtual, es para redefinirle (override) en toda la jerarquía de
clases
derivadas, para aprovechar así el polimorfismo.

El polimorfismo es tremendamente útil, pues permite que una llamada a método
se
resuelva no según el tipo estático de una variable, sino según el tipo real
del objeto
al que esa variable apunta. Por ejemplo, si en tu caso haces (después de
arreglar
Leon y Gato :-)

Animal a = new Leon();
a.HacerSonido(); // el método de Leon, pq a hace referencia a un león

se ejecutará el método HacerSonido de Leon y no el de Animal. Más adelante
podrás hacer:

Animal a = new Gato(); // la misma variable en principio
a.HacerSonido(); // el método de Gato, pq ahora a hace referencia a un
gato

Si HacerSonido no fuera virtual, el compilador resolvería estáticamente
ambas
llamadas al método HacerSonido() de la clase Animal, y se perdería toda la
gracia :-)

Fíjate si el polimorfismo es importante para la POO, que en algunos
lenguajes
como Java *TODOS* los métodos son virtuales, sin ninguna otra opción.

Slds - Octavio




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida