Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ereditarietà

Come estendere le classi ereditandone metodi e proprietà
Come estendere le classi ereditandone metodi e proprietà
Link copiato negli appunti

L'ereditarietà è quella capacità di un oggetto di ricevere metodi e proprietà da una classe già esistente, estendenone le capacità espressive o specializzandola. La classe da cui si eredita infatti è tipicamente su un piano concettuale più astratto, o più ampio, rispetto all'erede. Ad esempio la classe "Animale" può essere specializzata dalla classe "Cane".

Per gli aspetti più "filosofici" possiamo fare riferimento alla nostra Guida OOP, qui invece ci concentriamo sulle particolarità offerte da Objective C grazie ad un semplice esempio.

La dichiarazione di una classe, come pure l'estensione da una classe base, come abbiamo già osservato negli esempi precendenti, avviene nel file di interfaccia .h, grazie alla direttiva @interface:

@interface Animale : NSObject

In questo caso ereditiamo l'oggetto base. In effetti se dovessimo ereditare la classe Animale, che abbiamo appena scritto, il meccanismo sarebbe del tutto analogo:

@interface Cane : Animale

Come abbiamo detto, le variabili di istanza, se non altrimenti specificato, sono protette e sono ereditate dalle sottoclassi. Per quanto abbiamo visto riguardo alla visibilità dei metodi, le proprietà possono solo essere pubbliche.

Il costruttore

In Objective C il costruttore della classe è in realtà composto dalla chiamata di due metodi annidati, il primo serve per l'allocazione della memoria alla classe, il secondo per l'inizializzazione delle variabili della stessa. L'istanza della classe Animale dell'esempio precedente avviene nel seguente modo:

Animale *animale = [[Animale alloc] init];

Il metodo init, della classe NSObject, è quello che più somiglia al concetto di costruttore di java, in esso si inizializzano tutte le variabili che utilizzerà la classe. Ovviamente il metodo init può accettare anche parametri diversi.

-(id) init

L'oggetto super

super è un riferimento alla superclasse dalla quale l'oggetto deriva. L'oggetto super è indispensabile quando si vuole creare un metodo di inizializzazione diverso da quello standard init o quando occorre fare l'override di un metodo della superclasse ad esempio dealloc; entrambi i metodi li vedremo tra poco.

L'oggetto self

Oltre a super, ogni metodo riceve un parametri implicito (non dichiarato) detto self e si tratta di un riferimento all'oggetto corrente.

L'oggetto self è utilizzato quando si vuole mandare un messaggio (invocare un metodo) interno alla classe o quando si intende modificare il valore di una variabile di istanza come in questo esempio:

NSString *stringa = [self metodoSenzaParametri];

Override

È possibile effettuare l'ovverride di un metodo definito nella superclasse semplicemnte creando un metodo con lo stesso nome e gli stessi parametri, all'interno di questo metodo è possibile riferirsi a quello della superclasse attraverso l'oggetto super.

Vediamo come fare se vogliamo effettuare l'override del metodo init della superclasse.

-(id) init
{
  if(self=[super init]) { }
  return self;
}

Overload dei metodi

In Objective C non è possibile effettuare l'overload dei metodi come in Java; anche se è possibile ad esempio scrivere il seguente codice:

-(id) init;
-(id) init:(int) variabile andAltraVariabile:(float) variabile2;

Questa definizione può trarre in inganno, ma i due metodi non sono uguali! Il primo ha un selettore :

init:

il secondo invece:

init: andAltraVariabile:

Qualora la nostra classe implementi più metodi init, ad esempio, occorre sempre effettuare l'override del metodo "init senza parametri", per evitare che l'utente possa inizializzare la nostra classe in modo anomalo utilizzando il metodo init della superclasse.

Quando effefftuiamo l'override del metodo init possiamo anche richiamare uno dei metodi init più specifico, passandogli dei valodi di default. Ad esempio:

-(id) init
{
  return [self init:0 andAltraVariabile:2.0];
}
-(id) init:(int) variabile andAltraVariabile:(float) variabile2
{
  if(self=[super init])
  {
    // Qui inizializziamo tutte le variabili della classe.
  }
  return self;
}

Ti consigliamo anche