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

#1 Jorge_Mota
07/08/2007 - 22:15 | Informe spam
estás confundido, necesitas reforzas tus conocimientos de OOP (o POO en
español :)
si te fijas en este método:
public override double Area()
{
return PI * x * x;
}

Dice Override, eso significa sobreescribir

En realidad c es del tipo Circle y el tipo Circle a su tipo es del tipo
Dimension

Se define la clase base Dimension que implementa los métodos generales,
por decirlo de alguna manera y las propiedades generales (o también
comunes)

Luego se define la clase específica (circle, cylinder, sphere) en la que
se sobreescribe el método Area, para que se ajuste a la necesidad real del
objeto. esto es la forma de calcular el área del mismo.



En Tue, 07 Aug 2007 14:04:02 -0600, Luis Rodriguez
escribió:

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?





http://fox.desdeguate.com
Respuesta Responder a este mensaje
#2 Luis Rodriguez
07/08/2007 - 22:44 | Informe spam
pero los objetos c,s yl son objetos de la clase q le corresponde o de la
clase Dimensions?
Respuesta Responder a este mensaje
#3 Jorge_Mota
07/08/2007 - 23:03 | Informe spam
son objetos de la clase que les corresponde
te lo repito, repasa OOP.


http://fox.desdeguate.com
Respuesta Responder a este mensaje
#4 Luis Rodriguez
08/08/2007 - 21:08 | Informe spam
estuve revisando y ambas son clases de tipo Dimensions y del tipo q le
corresponde
porque puedo usar las variables de la clase Dimensions y los metodos de la
clase q le corresponde(pero no las variables de la clase q les corresponde)
alguien puede darme algun buen tutorial acerca del polimorfismo? no le
entiendo al 100%
Respuesta Responder a este mensaje
#5 Octavio Hernandez
09/08/2007 - 10:53 | Informe spam
Toda variable tiene un tipo ESTATICO (el que has declarado en el texto del
programa) y un tipo DINAMICO (el del objeto al que ella apunta en tiempo de
ejecución). El tipo dinámico puede coincidir con el estático o ser una clase
heredera de éste. Tus variables c, s y l son estáticamente de tipo
Dimensions, pero cuando el programa se ejecute apuntarán a una instancia de
Circle, Sphere y Cylinder respectivamente.

Las llamadas a métodos virtuales como Area() se resuelven EN TIEMPO DE
EJECUCION, mirando el tipo real al que pertenece el objeto al que la
variable apunta.

Descarga el libro gratuito de C# en www.josanguapo.com, te puede ayudar.

Slds - Octavio



"Luis Rodriguez" wrote in message
news:
estuve revisando y ambas son clases de tipo Dimensions y del tipo q le
corresponde
porque puedo usar las variables de la clase Dimensions y los metodos de la
clase q le corresponde(pero no las variables de la clase q les
corresponde)
alguien puede darme algun buen tutorial acerca del polimorfismo? no le
entiendo al 100%

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida