Programmazione iOS e Mac(teoria), Ereditarietà

Ereditarietà

Attraverso il meccanismo dell’ereditarietà è possibile creare una classe avente tutte le potenzialità della classe di livello superiore, dalla quale appunto eredita evitando duplicazione inutile di codice

Tutto il codice duplicato lo si mette a disposizione di una classe comune,minimizzando la manutenzione e aumentando l’efficienza .

Una classe acquisisce le caratteristiche di un’altra classe detta genitore o meglio nota come superclasse. La classe ereditante viene invece chiamata figlia oppure subclass.

La definizione di classe è detta essere addittiva in quanto ogni nuova classe che si definisce è basata su un’altra classe dalla quale eredita metodi e variabili istanza.
La nuova classe aggiunge funzionalità oppure modifica quelle della classe da cui eredita.

L’ereditarietà viene espressa ponendo dopo i due punti ‘:’ il nome della superclasse:

@interface myClass:superclass

Objective-C non prevede l’ereditarietà multipla, ossia la possibilità di ereditare da due o più classi.

L’ereditarietà collega tutte le classi secondo una struttura ad albero con una sola classe come radice

Una forma di ereditarietà multipla viene raggiunta mediante l’uso delle categorie o dei protocolli, ossia la possibilità di ereditare da due o più classi .

Partendo da NSObject, ogni livello successivo rappresenta un grado di specializzazione maggiore. La classe NSObject definisce il framework di base per tutti gli oggetti Objective-C e le interazioni tra loro e col runtime system.

Quando viene creata un’istanza di una classe, il nuovo oggetto conterrà anche tutte le variabili istanza delle classi appartenenti alla gerarchia fino a NSObject.

Un oggetto oltre ad aver accesso ai metodi propri può far uso dei metodi appartenenti alle classi da cui eredita.

Quando si definisce una nuova classe è possibile implementare un metodo avente lo stesso nome di un metodo definito in una classe appartenente alla gerarchia. Si dice che il nuovo metodo ridefinisce quello originale (overriding).

Overriding

La superclasse può dichiarare nell’interfaccia un metodo comune a tutte le classi figlie, ognuna delle quali prevederà la propria versione.

Se siamo sicuri che tutte le classi figlie implementeranno taluno metodo, l’implementazione nella superclasse potrà anche essere vuota.

Qualsiasi riferimento al metodo presente nella gerarchia a partire dalla nuova classe sarà relativo alla ridefinizione e non alla definizione originale .

Definire una nuova classe è equivalente a definire un nuovo tipo di dato. Il nuovo tipo così descritto oltre a presentare una struttura dati (variabili istanza) presenta anche dei meccanismi per manipolare tali variabili (metodi).

E’ possibile dichiarare un oggetto di tipo classe specificando il nome della classe anzichè usare il puntatore ad oggetto id

NuovaClasse *miaClasse;  (Static typing)

Static typing

Con lo static typing il compilatore ha tutte le informazioni riguardanti il tipo di dato. Gli oggetti vengono tipizzati staticamente sempre mediante puntatori a classi. La tipizzazione statica esplicita il puntatore al contrario di id.

E’ possibile ottenere qualche informazione riguardante la classe durante l’esecuzione del programma attraverso i metodi della classe NSObject: