[Objective-C] - 02 Properties e Costruttori

Post on 29-Jan-2018

3.672 views 0 download

Transcript of [Objective-C] - 02 Properties e Costruttori

Properties e Costruttori

AGENDA

• Proprietà @public, @protected e @private

• Accesso alle variabili

• Costruttori multipli

PROPRIETA' (1)

Un elemento molto importante in OOP è lo scope (l'ambito) delle proprietà di una classe.

Objective-C ha tre tipi di scope:

• @public

• @protected

• @private

PROPRIETA' (2)

@public: permette l'accesso diretto alla variabile senza dover utilizzare i metodi accessor. Non utilizzare mai!

@protected: permette l'accesso alla variabile solo alle classi che estendono la classe cui essa appartiene.

@private: permette l'accesso alla variabile solo ai metodi della classe stessa.

PROPRIETA' (3)

@interface ClassA : NSObject {

@publicNSString *cognome;

}

...

@end

ClassA *a = [[ClassA alloc] init];

a->cognome = @"Pippo";NSString *n = a->cognome;

Variabili @public

PROPRIETA' (4)

@interface ClassA : NSObject {

@protectedNSString *nome;

}

@property (retain) NSString *nome;

@end

ClassA *a = [[ClassA alloc] init];

NSString *n = [a nome];[a setNome:@"Pippo"];

Variabili @protected

PROPRIETA' (5)

@interface ClassA : NSObject {

@protectedNSString *nome;

@privateNSString *anni;

}

...

@end

@interface ClassB : ClassA...

@implementation ClassB

-(void)aMethod {

NSString nome = [self nome];

NSString anni = [self anni];

}

@end

Variabili @private

ACCESSO (1)

Per accedere alle proprietà di una classe possiamo utilizzare tre diverse notazioni:

• [ ] : parentesi quadre.

• . : "punto". Approccio simile ad altri linguaggi come Java.

• -> : freccia.

ACCESSO (2)

Attraverso le parentesi quadre:

Attraverso il punto:

NSString *n = [a nome];

[a setNome:@"Pippo"];

NSString *n = a.nome;

a.nome = @"Pippo";

ACCESSO (3)

Attraverso la "freccia" accedo direttamente alle variabili di una classe (vedi esempio di variabili @public) senza utilizzare i metodi getter/setter.

NSString *c = a->cognome;

a->cognome = @"Pippo";

COSTRUTTORI (1)

A volte il costruttore di default non è sufficiente per inizializzare un oggetto secondo le nostre esigenze.

Possiamo quindi creare dei costruttori multipli che accettano, analogamente ai metodi, uno o più parametri.

Ci sono tuttavia delle "best practies" da adottare qualora volessimo creare più costruttori.

COSTRUTTORI (2)

A differenza del costruttore di default dobbiamo dichiararne l'esistenza nell'interfaccia.

@interface ClassA : NSObject {

NSString *nome;NSString *cognome;

}

- (id)initWithNome:(NSString *)n;

- (id)initWithNome:(NSString *)n andCognome: (NSString *)c;

@end

COSTRUTTORI (3)

Per l'implementazione è consigliabile sviluppare solo il costruttore con più argomenti...

@implementation ClassA

- (id)init {...}- (id)initWithNome:(NSString *)n {...}

- (id)initWithNome:(NSString *)n andCognome: (NSString *)c {if(self = [super init]) {

nome = n;cognome = c;

}return self;

}...

COSTRUTTORI (4)

... utilizzando gli altri (a cascata) per impostare valori di default.

@implementation ClassA

- (id)init {return [self initWithNome:@"nomeDEFAULT"];

}

- (id)initWithNome:(NSString *)n {return [self initWithNome:n andCognome:@"cognomeDEFAULT"];

}

- (id)initWithNome:(NSString *)n andCognome: (NSString *)c {...}

...

alla prossima...