Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema con metodos virtuales en c#

Estas en el tema de Problema con metodos virtuales en c# en el foro de .NET en Foros del Web. no encontre otro foro mas adecuado para esta pregunta tengo este fragmento de codigo: Código: using System; using System.Collections.Generic; using System.Text; namespace PruebaMetodosVirtuales { class ...
  #1 (permalink)  
Antiguo 07/08/2007, 14:01
Avatar de Farookh_Bulsara  
Fecha de Ingreso: mayo-2004
Mensajes: 1.185
Antigüedad: 20 años, 8 meses
Puntos: 2
Problema con metodos virtuales en c#

no encontre otro foro mas adecuado para esta pregunta
tengo este fragmento de codigo:
Código:
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?
__________________
"Todas las cosas deben mostrarse primero con mascaras tetricas y terrorificas para que puedan inscribirse a si mismas en el corazon de la humanidad"
  #2 (permalink)  
Antiguo 29/02/2008, 10:39
 
Fecha de Ingreso: febrero-2008
Mensajes: 1
Antigüedad: 17 años
Puntos: 0
Re: Problema con metodos virtuales en c#

Cita:
Iniciado por Farookh_Bulsara Ver Mensaje
no encontre otro foro mas adecuado para esta pregunta
tengo este fragmento de codigo:
Código:
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?

Hola, buen día antes qeu anda quiero comentarte que no soy un experto en la materia pero, tratare de explicarte lo poco que se y lo poco que entiendo:

Construccion de objetos: Se usa un nuevo constructor en cada caso, pero este constructor usa el constructor del padre, pasando el argumento que recibe y colocando 0 en el otro argumento.


Clases: Los objetos c, s, y l son objetos de tipo Circle,Sphere o Cylinder, respectivamente, pero no olvides que estas calse derivan de Dimensions, por lo tanto HEREDAN TODOS los metodo y propiedades de la clase Dimensions, asi que puedes hacer uso de los métodos de la calse hija o la calse padre.

Con respecto a los metodos virtuales: No es que elimines el mètodo de la calse padre sino mas bien que escribes un nuevo método en la calse hija, cuando llamas al método lo se aplica el método de la calse hija y no el de la calse padre. Este es un buen ejeplo de los métodos virtuales ya que para cada figura diferente se aplica una formula distitan y magina que tienes ahora tienes una clase triángulo deberias reescribir el método Area.

Espreso que esto te ayude si quieres mas información poste y si hay correciones en lo que escribì por favor haganmelo saber.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:04.