This article has been localized into Italian by the community.
Classi astratte
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' (Impossibile creare un istanza della classe astratta o dell'interfaccia '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.