2010-04-11 14 views
8

मैं एक उद्देश्य-सी ट्यूटोरियल के माध्यम से अपना रास्ता काम करने की कोशिश कर रहा हूं। पुस्तक में इस उदाहरण है:उद्देश्य-सी गेटर/सेटर

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

मैंने सोचा, "।। हे वहाँ XYPoint वस्तु के लिए कोई गेटर/सेटर है कोड हालांकि काम करता है" अब मैं अपने खुद के प्रश्न का उत्तर देने जा रहा हूं :)।

मैं इसके बारे में सोचती है, क्योंकि "मूल" एक सूचक पहले से ही है, और "चौड़ाई" और "ऊंचाई" के साथ हुड के नीचे हो रहा क्या, है कि वहाँ जाने ते उन्हें एक सूचक बनाया जा रहा है ..

Am मैं सही हूँ, या मैं बीएस बात कर रहा हूँ :) ??

मुझे बस यह नहीं मिला। धन्यवाद myRect.origin = myPoint; मैं इसके लिए एक सेटर नहीं किया ..

Btw: यहाँ मुख्य है:

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

और यहाँ आयत वस्तु है:

#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 

क्या मुझे नहीं समझ में मुख्य में इस लाइन है आपके तेज उत्तर के लिए

उत्तर

20

क्या मुझे नहीं समझ में मुख्य में इस लाइन है: वहाँ है myRect.origin = myPoint; मैं इसके लिए एक सेटर नहीं किया ..

दोनों एक गेटर और एक सेटर (सामूहिक रूप से accessors के रूप में भेजा) के लिए Rectangle कक्षा में बनाया गया था।आप Rectangle के लिए लागू करने में एक नजर है, तो यह गेटर है:

-(XYPoint *) origin 
{ 
    return origin; 
} 

और इस सेटर है:

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

और के रूप में ऑब्जेक्टिव-सी 2.0 बुला:

myRect.origin = myPoint; 

बराबर है:

[myRect setOrigin:myPoint]; 

@property (और फिर @synthesize का उपयोग करके उन्हें लागू करने) का उपयोग करने वाले गेटर्स और सेटर्स को घोषित करना) एक्सेसर्स घोषित करने और बनाने का एक ही तरीका है, और यदि आपके पास कक्षा इंटरफ़ेस में घोषित करने के लिए बहुत सारी संपत्तियां हैं तो सुविधा के लिए वहां है। के रूप में Schildmeijer कहा, @property int width दो तरीकों घोषित करने के बराबर है:

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

ऑब्जेक्टिव-सी विधि कॉल का गतिशील रूप से बाध्य प्रकृति के कारण, आप भी नहीं में मनुष्य और सेटर तरीके घोषित करने के लिए है इंटरफेस, हालांकि यह आमतौर पर ऐसा करने का सबसे अच्छा अभ्यास है यदि आप उन्हें अन्य वर्गों के लिए सार्वजनिक रूप से उपलब्ध करा रहे हैं।

6

आप एक संपत्ति घोषणा के बारे में सोच सकते हैं जो दो एक्सेसर विधियों को घोषित करने के बराबर है।

- (int)width; 

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

आप कहते हैं कि क्या कूट चल रहा है, या क्या अपनी उम्मीदों "काम" के लिए कर रहे हैं: इस प्रकार

@property int width; 

के बराबर है। इन दोनों अनुरूप हैं -

ऊपर इंटरफ़ेस चौड़ाई और ऊंचाई के लिए सरल एक्सेसर तरीकों कि [object setWidth:1]; या object.width = 1; के रूप में अन्य वस्तुओं से कहा जा सकता है पैदा करेगा।

उत्पत्ति कुछ अन्य वस्तु प्रकार है और एक सूचक है, हां। लेकिन आप अभी भी एक्सेसर विधियों को उत्पन्न करने के लिए इसके लिए एक संपत्ति घोषित करना चाहते हैं।

0

गेटर्स और सेटर्स अधिकतर उपयोगी होते हैं यदि आपको किसी अन्य वर्ग से इंस्टेंस वैरिएबल तक पहुंचने की आवश्यकता होती है या आप उन्हें प्राप्त करने/सेट करने के लिए बाइंडिंग का उपयोग कर रहे हैं। तो मेरा अनुमान यह होगा कि आपको चौड़ाई और ऊंचाई के लिए इस कार्यक्षमता की आवश्यकता है लेकिन मूल के लिए नहीं। ध्यान दें कि गेटर्स/सेटर्स पूर्णांक से पॉइंटर्स नहीं बनाते हैं जैसा आपने कहा था कारण हो सकता है। चींटियां स्याही होती हैं और गेटर्स/सेटर बदलते नहीं हैं।

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

} 

आप कर मनुष्य केवल या गेटर और सेटर

• केवल पढ़ने के लिए

• गेटर = newGetterName

• सेटर = नए SetterName

उदाहरण

नाम बदलना चाहते हैं तो
//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property (getter = getWidth) int Width; 
@property (readonly) int Height; 
@end