TOC

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

Classi:

Abstract classes

Le classi astratte, individuate con la keyword abstract nella definizione di classe, sono tipicamente usate per definire una classe base. Quello che le caratterizza, è che non si può creare un'istanza con esse - se ci provi, riceverai un errore dal compilatore. Invece, devi necessariamente creare una classe derivata, come imparato nel capitolo delle classi derivate, e creare una istanza della classe derivata. Quindi, quando hai bisogno di una classe astratta? La risposta è che dipende da quello che vuoi fare.

Ad essere sincero, potresti fare molto senza aver bisogno delle classi astratte, ma sono perfette per specifici utilizzi, come nei framework, infatti è facile che tu trova molte classi astratte nel .NET framework. Una buona regola da applicare è che il nome effettivamente ha molto senso - le classi astratte sono molto, ma non sempre, utilizzate per descrivere qualcosa di astratto, qualcosa che è più un concetto che una cosa reale.

In questo esempio, creeremo una classe base per gli animali a quattro zampe e poi creeremo una classe Dog, che sarà la classe derivata, come questo:

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
    {

    }
}

Se lo confronti con gli esempi del capito che tratta le classi derivate, non noterai una grande differenza. Infatti, la keyword abstract davanti alla definizione di FourLeggedAnimal è la maggiore differenza. Come puoi vedere, noi creiamo una istanza della classe Dog e poi chiamiamo il metodo ereditato Describe() dalla classe FourLeggedAnimal. Adesso invece prova a creare una istanza della classe FourLeggedAnimal.

FourLeggedAnimal someAnimal = new FourLeggedAnimal();

Riceverai questo errore:

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

Adesso, come puoi vedere, ereditiamo il metodo Describe(), ma non è molto utile nella sua forma originale, per la nostra classe Dog. Riscriviamola con la keyword override:

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

In questo caso, abbiamo fatto un override completo, ma a volte, potresti voler usare il metodo della classe base aggiunto a nuove funzionalità. Questo può essere fatto usando la base keyword, che si riferisce alla classe che abbiamo ereditato.

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;
    }
}

Adesso ovviamente, puoi creare altre classi derivate della classe FourLeggedAnimal - forse un gatto o un leone? Nel prossimo capitolo, faremo un esempio più avanzato e introdurremo i metodi astratti. Continua a leggere.

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!