Ejemplo Practico de las Clases Abstractas
[con C#]

Fecha: 27/Oct/2004 (26/Oct/2004)
Actualizado: 31/Oct/2006
Autor: SergioTarrillo - Email
Blog: sergiotarrillo blog
 

 

.

Quién no llevo P.O.O, ya sea en Java, C++, o ahora en lo que es Net. Todo siempre empezaba bonito crear constructores, hacer herencia, pero cuando llegamos a Clases Abstractas, ahí empiezan los problemas, que son, cual es su diferencia con Interfaces como se relacionan con Polimorfismo, trataremos de definir y explicar todo estos pequeños problemas, auque no es objetivo conocer a fondo a las clases abstractas, solo darle un marco de referencia y ver su aplicación en un ejemplo con C#.

Definiciones:

1. Son clases de las que no es posible crear instancias; frecuentemente, están implementadas sólo parcialmente o no están implementadas. (definición en MSDN library).

2. Una clase abstracta es aquella que forzosamente se ha de derivar si se desea que se puedan crear objetos de la misma o acceder a sus miembros estáticos. (con esto suficiente, por ahora).

Diferencia con una interface:

Pareciera que son lo mismo, las clases abstractas no se implementa y las interfaces tampoco. Pero las interfaces son mas un conjunto de comportamientos definidos, que esperan ser implementados por el programador. Las clases abstractas, en primer lugar deben ser heredadas para ser implementadas en su totalidad o parcialmente, las clases abstractas se usan mas para una relación de " es un ", como en la siguiente figura:

Polimorfismo en Clases Abstractas:

Recordar que polimorfismo es la capacidad de un objeto de comportarse de diferentes formas, dependiendo de que clase haya sido instanciada. Si declaramos una clase abstracta, si bien esta no puede ser instaciada si puede ser declarada y luego ser instanciada por todas las clases que son heredas esto se vera mas adelante en el ejemplo. (en la clase del formulario windows)

 

cFigura.cs

using System;
using System.Windows.Forms;

namespace ClasesAbstractas
{
    
    abstract class FiguraGeometrica {

        public abstract double Area();    
    }


    class Circulo: FiguraGeometrica   {
        private int radio;


        // A read-write instance property:
        public int Radio  {
            get  {
                return radio; 
            }
            set  {
                radio = value; 
            }
        }


        public Circulo(int r) {
            Radio = r;
        }

        public override double Area()   {
            return (double)(Radio*Radio*3.14);
        }

    }


    //calse tirangulo
    class Triangulo: FiguraGeometrica
    {
    
        //propiedades
        private int ladA;
        private int ladB;
        private int ladC;

        //propiedades
        public int LadoA
        {
            get {
                return ladA; 
            }
            set  {
                ladA = value; 
            }
        }
        public int LadoB   {
            get   {
                return ladB; 
            }
            set   {
                ladB = value; 
            }
        }
        public int LadoC {
            get {
                return ladC; 
            }
            set {
                ladC = value; 
            }
        }


        public Triangulo (int a, int b, int c)
        {
            LadoA = a;
            LadoB = b;
            LadoC = c;
        }

        public override double Area()
        {
            double num, mPer;

            mPer = (double)(LadoA+LadoB+LadoC)/2;

            num = mPer*(mPer-LadoA)*(mPer-LadoB)*(mPer-LadoC);

            if (num <= 0 ) {            
                MessageBox.Show("posiblemente el triangulo no exista, intentelo nuevamente"); 
                return 0;
            }
            else
                return Math.Pow(num,0.5);

        }

    }


    class Cuadrado: FiguraGeometrica 
    {
        //atributos
        private int lado;

        public int Lado {
            get {
                return lado; 
            }
            set  {
                lado = value; 
            }
        }

        public Cuadrado(int l)  {
            Lado = l;
        }

        public override double Area()   {
            return Lado*Lado;
        }

    }
}

 

Form1.Cs[CmdgetArea_Click]

    

        private void cmdgetAreaCir_Click(object sender, System.EventArgs e)
        {
            //area del circulo
            if (txtRadio.Text != "") 
            {
                figura = new Circulo(Int32.Parse(txtRadio.Text));

                MessageBox.Show("el area del circulo es: " + figura.Area().ToString());
            }

            //area del triangulo
            if (txtCuadLad.Text != "") 
            {
                figura = new Cuadrado(Int32.Parse(txtCuadLad.Text));

                MessageBox.Show("el area del cuadrado es: " + figura.Area().ToString());
            }

            //area del triangulo
            if (txtTrLA.Text != "" && txtTrLC.Text != "" && txtTrLC.Text != "") 
            {
                figura = new Triangulo(Int32.Parse(txtTrLA.Text),Int32.Parse(txtTrLB.Text),Int32.Parse(txtTrLC.Text));

                MessageBox.Show("el area del triangulo es: " + figura.Area().ToString());
            }

          }

 

Conclusiones: El tema de Clases abstractas no es difícil, solo que generalmente no encontramos los ejemplos adecuados. He tratado de ser lo mas claro posible, cualquier pregunta o duda mándenla al correo de arriba. Si quieren la versión en VB. Net me avisan al correo.

P.D.: No olviden calificar este artículo.


ir al índice

Fichero con el código de ejemplo: sergio_ClaseAbstracta - Tamaño 36 KB