2010-04-11 34 views
8

Tôi đang cố gắng làm việc theo cách của mình thông qua hướng dẫn Mục tiêu-C. Trong cuốn sách có ví dụ này:Mục tiêu-C getter/setter

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

Tôi nghĩ, "này không có getter/setter cho đối tượng XYPoint. Mã hoạt động mặc dù." Bây giờ tôi sẽ có thể trả lời câu hỏi của riêng tôi :).

Tôi nghĩ mình bởi vì "gốc" là một con trỏ đã có, và whats xảy ra dưới mui xe với "width" và "height", là có đang xảy ra te được tạo ra một con trỏ cho họ ..

Am i phải, hoặc tôi đang nói BS :) ??

Tôi chỉ không hiểu. đây là chính:

#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; 
} 

Và đây là đối tượng 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 

gì tôi không hiểu dòng này trong chính là: myRect.origin = myPoint; tôi đã không làm cho một setter cho nó ..

BTW nhờ cho câu trả lời nhanh của bạn

Trả lời

20

gì tôi không hiểu là dòng này trong chính: myRect.origin = myPoint; tôi đã không làm cho một setter cho nó ..

được cả một getter và setter (gọi chung là accessors) được tạo cho origin trong lớp Rectangle.Nếu bạn có một cái nhìn trong việc thực hiện cho Rectangle, đây là getter:

-(XYPoint *) origin 
{ 
    return origin; 
} 

và đây là setter:

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

Và như của Objective-C 2.0 gọi điện thoại:

myRect.origin = myPoint; 

tương đương với:

[myRect setOrigin:myPoint]; 

Khai báo getters và setters bằng cách sử dụng @property (và sau đó triển khai chúng bằng cách sử dụng @synthesize) chỉ là một cách để khai báo và tạo accessors, và có tiện lợi nếu bạn có nhiều thuộc tính để khai báo trong giao diện lớp. Như Schildmeijer nói, @property int width tương đương với tuyên bố hai phương pháp:

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

Do tính chất động-bound các cuộc gọi phương pháp Objective-C, bạn thậm chí không có để khai báo các phương pháp getter và setter trong giao diện, mặc dù thường là cách thực hành tốt nhất để làm như vậy nếu bạn quảng cáo chúng dưới dạng công khai có sẵn cho các lớp khác.

6

Bạn có thể nghĩ về tuyên bố thuộc tính tương đương với việc khai báo hai phương thức truy cập. Như vậy

@property int width; 

tương đương với:

- (int)width; 

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

Bạn không nói những gì đang làm việc, hoặc những gì mong đợi của bạn là dành cho "làm việc".

Giao diện trên sẽ tạo các phương thức truy cập đơn giản cho chiều rộng và chiều cao có thể được gọi từ các đối tượng khác dưới dạng [object setWidth:1]; hoặc object.width = 1; - hai giá trị này tương tự nhau.

Xuất xứ là một số loại đối tượng khác và là con trỏ, có. Nhưng bạn vẫn muốn khai báo một thuộc tính cho nó để tạo ra các phương thức accessor.

0

Getters và setters hầu như hữu ích nếu bạn cần truy cập một biến mẫu từ một lớp khác hoặc bạn đang sử dụng các kết buộc để nhận/đặt chúng. Vì vậy, tôi đoán là bạn cần chức năng này cho chiều rộng và chiều cao nhưng không phải cho nguồn gốc. Lưu ý rằng các getters/setters không làm cho con trỏ ra khỏi các số nguyên như bạn đã nói có thể là lý do. Ints là ints và getters/setters không thay đổi điều đó.

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]); 

} 

Nếu bạn muốn chắc Getter chỉ hoặc đổi tên getter và setter

• readonly

• getter = newGetterName

• setter = SetterName mới

dụ

//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property (getter = getWidth) int Width; 
@property (readonly) int Height; 
@end 
Các vấn đề liên quan