2010-04-11 17 views
8

Sto provando a lavorare su un tutorial Objective-C. Nel libro c'è questo esempio:Objectetter-C getter/setter

@interface 
{ 
int width; 
int height; 
XYPoint *origin; 
} 
@property int width, height; 

ho pensato: ". Hey non c'è getter/setter per l'oggetto Xypoint Il codice funziona anche se" Ora sto andando forse a rispondere alla mia stessa domanda :).

I pensa la sua causa "origine" è un puntatore già, e che cosa sta accadendo sotto il cofano con "larghezza" e "altezza", è che ci sta te creare un puntatore a loro ..

Am ho ragione, o sto parlando BS :) ??

Non ho capito. ecco principale:

#import "Rectangle.h" 
#import "XYPoint.h" 
int main (int argc, char *argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Rectangle *myRect = [[Rectangle alloc] init]; 
    XYPoint *myPoint = [[XYPoint alloc] init]; 

    [myPoint setX: 100 andY: 200]; 
    [myRect setWidth: 5 andHeight: 8]; 

    myRect.origin = myPoint; 

    NSLog (@"Rectangle w = %i, h = %i", 
      myRect.width, myRect.height); 

    NSLog (@"Origin at (%i, %i)", 
      myRect.origin.x, myRect.origin.y); 

    NSLog (@"Area = %i, Perimeter = %i", 
      [myRect area], [myRect perimeter]); 

    [myRect release]; 
    [myPoint release]; 
    [pool drain]; 

    return 0; 
} 

Ed ecco l'oggetto Rectangle:

#import "Rectangle.h" 
#import "XYPoint.h" 

@implementation Rectangle 
@synthesize width, height; 

-(void) setWidth: (int) w andHeight: (int) h 
{ 
    width = w; 
    height = h; 
} 

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 
-(int) area 
{ 
    return width * height; 
} 
-(int) perimeter 
{ 
    return (width + height) * 2; 
} 
-(XYPoint *) origin 
{ 
    return origin; 
} 
@end 

Quello che non capisco è questa linea principale: myRect.origin = myPoint; non ho fatto un setter per esso ..

BTW, grazie per di

risposta

20

Quello che non capisco è questa linea principale: Ci myRect.origin = myPoint; non ho fatto un setter per esso ..

è sia un getter e setter (collettivamente denominate di accesso) creato per origin nella classe Rectangle.Se si dispone di uno sguardo nella realizzazione per Rectangle, questo è il getter:

-(XYPoint *) origin 
{ 
    return origin; 
} 

e questo è il setter:

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 

E come di Objective-C 2.0 chiamata:

myRect.origin = myPoint; 

è equivalente a:

[myRect setOrigin:myPoint]; 

Dichiarare getter e setter utilizzando @property (e quindi implementarli usando @synthesize) è solo un modo per dichiarare e creare accessor, ed è lì per comodità se si hanno molte proprietà da dichiarare nell'interfaccia di classe. Come Schildmeijer detto, @property int width è equivalente a dichiarare due metodi:

- (int)width; 
- (void)setWidth:(int)newWidth; 

A causa della natura dinamica-bound di chiamate di metodo Objective-C, non è nemmeno hanno per dichiarare i metodi getter e setter nel interfaccia, anche se in genere è meglio farlo se si pubblicizzano tali annunci come pubblicamente disponibili per altre classi.

6

Si può pensare a una dichiarazione di proprietà come equivalente a dichiarare due metodi di accesso la risposta veloce. Così

@property int width; 

è equivalente a:

- (int)width; 

- (void)setWidth:(int)newWidth; 
0

Tu non dici quello che il codice funziona, o che cosa sono le vostre aspettative per "lavorare".

L'interfaccia precedente creerà semplici metodi di accesso per larghezza e altezza che possono essere richiamati da altri oggetti come [object setWidth:1]; o object.width = 1; - questi due sono analoghi.

Origin è un altro tipo di oggetto ed è un puntatore, sì. Ma vorresti comunque dichiarare una proprietà per generare metodi di accesso.

0

I getter ei setter sono utili soprattutto se è necessario accedere a una variabile di istanza da un'altra classe o se si utilizzano i collegamenti per ottenerli/impostarli. Quindi suppongo che tu abbia bisogno di questa funzionalità per la larghezza e l'altezza ma non per l'origine. Nota che i getter/setter non fanno i puntatori al di fuori dei numeri interi come tu hai affermato potrebbe essere il motivo. Gli inte sono ints e getter/setter non lo cambiano.

0
//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property int Width; 
@property int Height; 
-(int)Area; 
@end 

//Rectangle.m 
#import "Rectangle.h" 
@implementation Rectangle 
@synthesize Width;/*Will create value Width , Setter called"setWidth" and Getter called "Width"*/ 
@synthesize Height;/*Will create value Height , Setter called"setHeight" and Getter called "Height"*/ 

-(int)Area 
{ 
    return Width*Height; 
} 
@end 


// main.m 
#import <Cocoa/Cocoa.h> 
#import "Rectangle.h" 
int main(int argc, const char * argv[]) 
{ 
    Rectangle *myRectangle = [Rectangle new]; 

    myRectangle.Width=3; 
    myRectangle.Height=5; 
    printf("Area = %d\n",[myRectangle Area]); 

    //Or 
    [myRectangle setWidth:5]; 
    [myRectangle setHeight:6]; 
    printf("Area = %d\n",[myRectangle Area]); 

} 

Se si vuole fare Getter solo o rinominare getter e setter

• sola lettura

• getter = newGetterName

• setter = new SetterName

esempio

//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property (getter = getWidth) int Width; 
@property (readonly) int Height; 
@end