Usare una classe astratta per creare un'astrazione

Completato

Un'interfaccia non è l'unica opzione disponibile per la creazione di astrazioni. Si vedrà ora come è possibile usare classi astratte per definire l'astrazione del codice specifico della piattaforma.

Che cos'è una classe astratta?

Una classe astratta è una classe decorata con la parola chiave abstract. Si decorerà la classe con la parola chiave abstract per mostrare che la classe non è completa e deve essere implementata in una classe derivata.

Non è possibile creare un'istanza di una classe astratta. Ecco perché si userà una classe astratta per fornire una definizione comune di una classe di base.

Usare una classe astratta per creare un'astrazione

Di seguito viene ripreso l'esempio precedente. Si supponga di voler mostrare all'utente una finestra di dialogo all'interno dell'applicazione. Ricordare che ogni piattaforma implementa le finestre di dialogo con messaggio in modo diverso.

In iOS si userà la classe UIAlertController:

class MessageDialog_iOS
{
    public void ShowMessage(string title, string message, string buttonText)
    {
        var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert);

        alert.AddAction(UIAlertAction.Create (buttonText, UIAlertActionStyle.Cancel, null));
        PresentViewController(alert, animated: true, completionHandler: null);
    }
}

In Android si userà la classe AlertDialog:

class MessageDialog_Android
{
    public void ShowMessage(string title, string message, string buttonText)
    {
        var alertDlg = (new AlertDialog.Builder(this)).Create ();
        alertDlg.SetMessage(message);
        alertDlg.SetTitle(title);
        alertDlg.SetButton(buttonText, okButton_Handler);
        alertDlg.Show();
    }

    private void okButton_Handler(object sender, DialogClickEventArgs e)
    {
        AlertDialog objAlertDialog = sender as AlertDialog;
        Button btnClicked = objAlertDialog.GetButton(e.Which);
        System.Diagnostics.Debug($"User clicked on the {btnClicked.Text} button");
    }
}

Creare una classe astratta e definirla:

public abstract class MessageDialog
{
    public abstract void ShowMessage(string title, string message, string buttonText);
}

Si noti l'uso della parola chiave abstract. Per usare la classe astratta MessageDialog è necessario derivare una nuova classe e implementare il metodo ShowMessage. Forzando la classe derivata, ci si assicura che sia possibile implementare il metodo in modo specifico per la piattaforma.

A questo punto, effettuare il refactoring delle classi specifiche della piattaforma per implementare la classe astratta.

Ecco l'esempio per iOS:

class MessageDialog_iOS : MessageDialog
{
    public override void ShowMessage(string title, string message, string buttonText)
    {
        var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert);

        alert.AddAction(UIAlertAction.Create (buttonText, UIAlertActionStyle.Cancel, null));
        PresentViewController(alert, animated: true, completionHandler: null);
    }
}

Ecco l'esempio per Android:

class MessageDialog_Android : MessageDialog
{
    public override void ShowMessage(string title, string message, string buttonText)
    {
        var alertDlg = (new AlertDialog.Builder (this)).Create ();
        alertDlg.SetMessage(message);
        alertDlg.SetTitle(title);
        alertDlg.SetButton(buttonText, okButton_Handler);
        alertDlg.Show();
    }

    private void okButton_Handler (object sender, DialogClickEventArgs e)
    {
        AlertDialog objAlertDialog = sender as AlertDialog;
        Button btnClicked = objAlertDialog.GetButton(e.Which);
        System.Diagnostics.Debug($"User clicked on the {btnClicked.Text} button");
    }
}