TOC

This article is currently in the process of being translated into Spanish (~48% done).

Clases:

Abstract classes

Clases abstractas, marcadas con la palabra clave "abstracto" en la definición de clase, son usadas tipicamente para definir una clase base en la jerarquía. Lo especial de estas, es que no puedes crear una instancia para las mismas - si lo intentas, tendrás un error de compilación. Dado el caso, tienes que crearlas como una subclase, como lo enseñado en el capitulo "herencia", y crear una instancia de tu subclase. Dicho esto ¿Cuando necesitas una clase abstracta? Realmente depende en lo que tratas de hacer.

Para ser honesto, puedes llegar a un estado avanzado en tu trabajo y no haber necesitado de una clase abstracta, pero son grandiosas para cosas especificas, como frameworks, lo cual es el porque encontraras una buena cantidad de clases abstractas dentro del framework .NET. Como buena regla general es que el nombre realmente tenga un gran sentido; clases abstractas son comúnmente, sino siempre, utilizadas para describir algo abstracto, mas cercano a un concepto que a un objeto real.

En este ejemplo, crearemos una clase base para "FourLeggedAnimal" y luego crear una clase llamada "dog", lo cual hereda de este, como veremos a continuacion:

namespace AbstractClasses
{
    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            Console.WriteLine(dog.Describe());
            Console.ReadKey();
        }
    }

    abstract class FourLeggedAnimal
    {
        public virtual string Describe()
        {
            return "Not much is known about this four legged animal!";
        }
    }

    class Dog : FourLeggedAnimal
    {

    }
}

If you compare it with the examples in the chapter about inheritance, you won't see a big difference. In fact, the abstract keyword in front of the FourLeggedAnimal definition is the biggest difference. As you can see, we create a new instance of the Dog class and then call the inherited Describe() method from the FourLeggedAnimal class. Now try creating an instance of the FourLeggedAnimal class instead:

FourLeggedAnimal someAnimal = new FourLeggedAnimal();

You will get this fine compiler error:

Cannot create an instance of the abstract class or interface 'AbstractClasses.FourLeggedAnimal'

Now, as you can see, we just inherited the Describe() method, but it isn't very useful in it's current form, for our Dog class. Let's override it:

class Dog : FourLeggedAnimal
{
    public override string Describe()
    {
        return "This four legged animal is a Dog!";
    }
}

In this case, we do a complete override, but in some cases, you might want to use the behavior from the base class in addition to new functionality. This can be done by using the base keyword, which refers to the class we inherit from:

abstract class FourLeggedAnimal
{
    public virtual string Describe()
    {
        return "This animal has four legs.";
    }
}


class Dog : FourLeggedAnimal
{
    public override string Describe()
    {
        string result = base.Describe();
        result += " In fact, it's a dog!";
        return result;
    }
}

Now obviously, you can create other subclasses of the FourLeggedAnimal class - perhaps a cat or a lion? In the next chapter, we will do a more advanced example and introduce abstract methods as well. Read on.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!