Problema con metodos virtuales

07/08/2007 - 22:04 por Luis Rodriguez | Informe spam
no encontre otro foro mas adecuado para esta pregunta
tengo este fragmento de codigo:
using System;
using System.Collections.Generic;
using System.Text;

namespace PruebaMetodosVirtuales
{
class Program
{
static void Main(string[] args)
{


double r = 3.0, h = 5.0;
Dimensions c = new Circle(r);
Dimensions s = new Sphere(r);
Dimensions l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());

}
}









public class Dimensions
{
public const double PI = Math.PI;
protected double x, y;
public Dimensions()
{
}
public Dimensions(double x, double y)
{
this.x = x;
this.y = y;
}

public virtual double Area()
{
return x * y;
}
}

public class Circle : Dimensions
{
public Circle(double r) : base(r, 0)
{
}

public override double Area()
{
return PI * x * x;
}
}

class Sphere : Dimensions
{
public Sphere(double r) : base(r, 0)
{
}

public override double Area()
{
return 4 * PI * x * x;
}
}

class Cylinder : Dimensions
{
public Cylinder(double r, double h) : base(r, h)
{
}

public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}



}


no entiendo esa parte de la construccion; los objetos c,s,l llegarina a ser
objetos de la clase Circle,Sphere o Cylinder, respectivamente ? o todos son
objetos de la clase Dimensions?
ya q las clases Circle,Sphere y Cylinder heredan de la clase Dimensions
y al llamar al metodo Area (al llamar desde los objetos c,s,l) a cual metodo
llama ,al virtual del padre o al q le corresponde a cada uno?
y una cosa mas ,estuve leyendo tutoriales pero hay algo q no le entiendo
sobre los metodos virtuales( ya entiendo su uso,pero no su funcionamiento)
osea dice que al poner a un metodo override ,reemplaza el codigo del metodo
de la clase padre, pero en realidad no lo reemplaza ,porque al volver a
llamar al metodo virtual de la clase padre el codigo es el mismo
alguien podria explicarmelo mejor porfavor?

Preguntas similare

Leer las respuestas

#6 Luis Rodriguez
10/08/2007 - 04:28 | Informe spam
mmmmmmm, osea que antes de ponerlo en ejecucion es como si fuera de dos
tipos? y cuando se ejecuta solo es de un tipo ,del tipo creado con new, es
asi?
entonces el polimorfismo solo consiste en poner una variable que sea del
tipo padre ,pero creada como hija
como esto:
Padre variable= new Hija();
siempre y cuando Hija extienda de Padre,asi:
class Hija : Padre

es solo eso o estoy mal?
Respuesta Responder a este mensaje
#7 Octavio Hernandez
10/08/2007 - 13:10 | Informe spam
entonces el polimorfismo solo consiste en poner una variable que sea del
tipo padre ,pero creada como hija
como esto:
Padre variable= new Hija();
siempre y cuando Hija extienda de Padre,asi:
class Hija : Padre



Esa es solo una de las bases del polimorfismo: a una variable de tipo X se
le puede asignar una referencia a un objeto de la clase X o de cualquier
clase descendiente. La herencia refleja una relación "ES UN", ¿no?, por lo
que tiene lógica que si Perro hereda de Mamifero, a una variable de la clase
Mamifero se le pueda asignar un perro; porque un perro es un mamífero.

Pero además de esto la otra base del polimorfismo son los métodos virtuales.
Cuando defines un método como virtual (y luego lo redefines en las clases
derivadas), estás diciendo al compilador que la llamada se debe resolver EN
TIEMPO DE EJECUCION en dependencia del tipo real del objeto al que apunte la
variable. A esto también le llaman LATE BINDING (enlace tardío).

Por el contrario, si el método no es virtual, se determina qué metodo llamar
en tiempo de compilación (EARLY BINDING). Ahí no hay polimorfisomo ninguno,
la llamada siempre se comportará igual.

Por ejemplo, supón que la clase Mamifero tiene dos métodos, M1 (virtual) y
M2 (no virtual). Supón luego que está la clase Perro, que redefine los dos
métodos a su manera. Supon luego que hacemos esto:

Mamifero m = new Perro("Rin-tin-tin");
m.M1();
m.M2();

El resultado será el siguiente:
- Como M1 es virtual, m.M1() se traducirá en una llamada al método M1 de
Perro, porque el tipo del objeto al que estará apuntando m en ese momento es
Perro;
- Como M2 no es virtual, m.M2() se traducirá en una llamada al método M2 de
Mamífero. Esto lo determinará el compilador AL COMPILAR EL PROGRAMA, sin que
le importe para nada el posible hecho de que cuando el programa se ejecute m
podrá estar apuntando a un perro, un gato o un león. A él le han dicho que m
es de tipo Mamífero, y se acabó.

Espero te ayude.

Slds - Octavio
Respuesta Responder a este mensaje
#8 Luis Rodriguez
10/08/2007 - 15:14 | Informe spam
muchisimas gracias
ahora me quedo clarisimo, deberias hacer tutoriales, sabes explicar muy bien
Respuesta Responder a este mensaje
#9 Octavio Hernandez
10/08/2007 - 17:36 | Informe spam
Gracias. Son los años que llevo en eso ;-)

¡Sigue avanzando!


"Luis Rodriguez" wrote in message
news:
muchisimas gracias
ahora me quedo clarisimo, deberias hacer tutoriales, sabes explicar muy
bien

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