Approfondimento sulle classi Objective-C

Definizione delle classi in Objective-C

La volta scorsa abbiamo definito alcune classi in Objective-C per fare un esempio pratico di oggetti, ereditarietà e polimorfismo. Mi hanno subito beccato con le mani nella nutella 😦 perché ahime i ragni non sono insetti… ma l’ultima volta che ho studiato biologia e affini era tanto tempo fa 🙂 più di 24 anni fa… Comunque capisco perché tutti fanno gli esempi con le figure geometriche!
La volta scorsa non sono sceso volontariamente nel dettaglio della sintassi per non appesantire uno scritto già fin troppo pieno di sorgenti.
Però adesso è il momento di mantenere la promessa fatta a fine articolo, perché ogni promessa è debito!

Allora avevamo la nostra classe Insetto, la ricordate? Il ragno l’ho calpestato per cui non c’è più!

//
// Insetto.h
//

# import <Cocoa/Cocoa.h>

@interface Insetto : NSObject {

NSString *nome;
}

- (NSString*) nome;
- (NSString*) cheInsettoSono;
- (NSString*) evoluzione;

@end

Si vedono subito delle differenze rispetto ad altri linguaggi come Java o il C++. I nomi dei metodi sono al di fuori delle graffe che delimitano l’oggetto. In realtà quello che conta è la @end. Nelle graffe vengono descritti i dati membro. Per cui se noi volessimo definire 2 oggetti nello stesso file basta fare così:

@interface Insetto : NSObject {

NSString *nome;
}

- (NSString*) nome;
- (NSString*) cheInsettoSono;
- (NSString*) evoluzione;

@end

@interface InsettoSauro : Insetto {

NSString *soprannome;
}

- (NSString*) soprannome;
@end

Il simbolo – davanti al metodo implica che il metodo è di istanza, un eventuale + indicherebbe che il metodo è di classe. Tanto per fare un paragone i metodi preceduti da un + sono come i metodi static di java e C++.
Vediamo anche questo con un po’ di codice.

//
// Insetto.m
//

#import "Insetto.h"

@implementation Insetto

- (NSString*) nome
{
return (@"Papà insetto. Che domande? :)");
}

- (NSString*) cheInsettoSono
{
return (@"Sono l'antenato di tutti gli insetti!");
}

- (NSString*) evoluzione;
{
return (@"io avevo ben 7 zampe, ma con l'evoluzione ne ho persa una. Meno male! Avanzavo sempre una scarpa");
}

@end
#import "Insetto.h"

@implementation Insetto

- (NSString*) nome
{
return (@"Papà insetto. Che domande?");
}

- (NSString*) cheInsettoSono
{
return (@"Sono l'antenato di tutti gli insetti!");
}

- (NSString*) evoluzione;
{
return (@"io avevo ben 7 zampe, ma con l'evoluzione ne ho persa una. Meno male! Avanzavo sempre una scarpa");
}

@end

@implementation InsettoSauro

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

if (self != nil)
{
numOfInsettoSauro++;
}
return self;
}

- (NSString*) nome
{
return (@"Insetto");
}

- (NSString*) soprannome
{
return (@"Sauro");
}

+ (int) contaInsettoSauro
{
return numOfInsettoSauro;
}

@end

Adesso scriviamo il main e vediamo cosa capita 🙂

#import <Foundation/Foundation.h>
#import "Insetto.h"

int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

Insetto *insetto;
InsettoSauro *insettoSauro, *insettoSauro2;

insetto = [Insetto new];
insettoSauro = [InsettoSauro new];

NSLog(@"Questo è l'insetto: %@ ", [insetto nome]);
NSLog(@"Questo è l'insettosauro: %@ ", [insettoSauro soprannome]);
NSLog(@"Questa è la chiamata al metodo di classe: %d ", [InsettoSauro contaInsettoSauro]);
insettoSauro2 = [InsettoSauro new];
NSLog(@"Questa è la chiamata al metodo di classe: %d ", [InsettoSauro contaInsettoSauro]);

[pool drain];
return 0;
}

Come si vede per chiamare contaInsettoSauro usiamo il nome della classe InsettoSauro e non il nome della sua istanza.

Altra cosa che avevamo notato è lo strano modo di chiamare le funzioni membro, cioè la sintassi tra parentesi quadre, in questo caso mi ha messo sulla buona strada il mio amico Juhan che mi ha ricordato Smalltalk. Per cui le chiamate ai metodi di un oggetto sono in realtà l’invio di un messaggio (giù le mani dai cellulari non sono gli sms) ad un particolare oggetto. Nel caso:

NSLog(@"Questo è l'insetto: %@ ", [insetto nome]);

Stiamo mandando il messaggio nome all’oggetto insetto. Per cui l’oggetto insetto eseguirà il metodo richiamato.    In Smalltalk leggeremo la sintassi come [ricevente messaggio] in objective-c sarà [oggetto metodo].
Se invece volessimo richiamare una funzione in stile C scriveremmo:

#import <Foundation/Foundation.h>

NSString* funzione()
{
return (@"Io sono una funzione");
};

int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSLog(@"Questa è una chiamata a funzione: %@ ", funzione());

[pool drain];
return 0;
}

Per concludere vediamo un’altra particolarità della definizione dei metodi e della loro chiamata. Aggiungiamo il metodo alla classe insetto che imposta il nome e il cognome dell’insetto. Volevo scrivere il metodo che gli assegnava una moglie insetto, ma poi ho avuto pietà di loro… ve lo immaginate quanto durerebbe il giro al negozio di scarpe con moglie insetto avendo a disposizione 6 piedi… i più sfigati sono i ragni che di zampe ne hanno 8… (e non sono insetti) ma torniamo a noi. In Insetto.h aggiungiamo la definizione.


- (void) setNomeCompleto: (NSString*) extNome cognome: (NSString*) extCognome;
- (NSString*) nomeCompleto;

Ho aggiunto quindi i metodi per impostare e visualizzare il nome completo, composto da un nome e un cognome. Scriviamo ora il codice di implementazione che andrà aggiunto in Insetto.m


- (void) setNomeCompleto: (NSString*) extNome cognome: (NSString*) extCognome
{
nome = extNome;
cognome = extCognome;
}

- (NSString*) nomeCompleto
{
return [[nome stringByAppendingString: @" "] stringByAppendingString: cognome];
}

Nel main mettiamo la chiamata al tutto:

insettoSauro2 = [InsettoSauro new];

[insettoSauro2 setNomeCompleto:@"Insetto" cognome: @"Sauro"];
NSLog(@"Stampiamo nome e cognome: %@ ", [insettoSauro2 nomeCompleto]);

Il risultato sarà qualche cosa di simile:

[Switching to process 313 thread 0x0]
2011-08-09 21:23:24.461 TP_2_OC[313:903] Stampiamo nome e cognome: Insetto Sauro
Program ended with exit code: 0

Per adesso è tutto, spero vi siate divertiti anche più di quello che mi sono divertito io a studiare un nuovo linguaggio. La prossima volta faremo qualche cosa di più appariscente e pratico in fondo abbiamo un mac a disposizione 🙂

Ciao, ciao.

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: