Sobes.tech
Junior

Hai usato classi astratte nei tuoi progetti?

sobes.tech AI

Risposta dell'AI

Sì, l'ho usato. Le classi astratte venivano utilizzate per creare strutture di base con metodi e proprietà comuni, che poi vengono ereditate da classi specifiche.

// Dichiarazione di una classe astratta
public abstract class Shape
{
    // Metodo astratto che deve essere implementato nelle classi derivate
    public abstract double GetArea();

    // Metodo virtuale con implementazione di default, che può essere sovrascritto
    public virtual void Draw()
    {
        Console.WriteLine("Disegnare una forma.");
    }
}

// Classe concreta che eredita da Shape
public class Circle : Shape
{
    public double Radius { get; set; }

    public Circle(double radius)
    {
        Radius = radius;
    }

    // Implementazione del metodo astratto
    public override double GetArea()
    {
        return Math.PI * Radius * Radius;
    }

    // Sovrascrittura del metodo virtuale
    public override void Draw()
    {
        Console.WriteLine($"Disegnare un cerchio con raggio {Radius}.");
    }
}

Principali scenari di utilizzo:

  • Definizione di un contratto generale: Le classi astratte permettono di definire un insieme di metodi e proprietà che devono essere presenti in tutte le classi derivate.
  • Implementazione parziale: Possibilità di fornire un'implementazione parziale della funzionalità nella classe base, evitando duplicazioni complete del codice nelle classi figlie.
  • Pattern di progettazione: Spesso utilizzate nell'implementazione di pattern come il "Template Method".

Differenze con le interfacce:

Caratteristica Classe astratta Interfaccia
Eredità Eredità multipla non consentita Implementazione multipla consentita
Implementazione Può contenere implementazioni di metodi Fino a C# 8.0 - solo dichiarazioni, dopo - implementazioni di default
Membri Può avere campi, costruttori, metodi virtuali/astratti/ordinari Fino a C# 8.0 - solo metodi e proprietà, dopo - anche membri statici e implementazioni di default
Stato Può avere stato (tramite campi) Non può avere stato