2009-04-13 24 views
7

जानकारी प्राप्त करना मेरे पास एक सेटटर विधि (setMinimumNumberOfSides) है जिसे मैं संश्लेषण का उपयोग करने के बाद ओवरराइड करना चाहता हूं। इसमें, यह सुनिश्चित करने के लिए कि int कुछ सीमाओं के भीतर है, उदाहरण के चर पर एक बाधा डाल रहा हूं।एक सेटर विधि को ओवरराइड करना, और

बाद में कस्टम इनिट विधि में, मैं एक और इंस्टेंस वैरिएबल (संख्याऑफसाइड्स) सेट कर रहा हूं, लेकिन मुझे यह सुनिश्चित करने की ज़रूरत है कि न्यूनतम NumberOfSides और maxNumberOfSides को सीमाओं के भीतर ठीक से सेट किया गया हो। मैंने सेटर पर रिटर्न वैल्यू को एक बूल में बदलने की कोशिश की, इसलिए यदि मैं सफल/असफल रहा तो मैं एक हाँ या नहीं वापस कर सकता था, लेकिन इससे एक विवादित विधि बनाई गई, मैं अनुमान लगा रहा हूं क्योंकि मैं संश्लेषण का उपयोग कर रहा हूं और सेटर को ओवरराइड कर रहा हूं।

सेटर को बुलाया गया और सफलतापूर्वक लौटाया गया यह देखने के लिए आसानी से जानकारी कैसे प्राप्त की जा सकती है?

-(void)setNumberOfSides:(int)sides 
{ 
    if ((sides < maximumNumberOfSides) && (sides > minimumNumberOfSides)) 
    { 
     numberOfSides = sides; 
    } 
    else 
     NSLog (@"Invalid number of sides: %d is outside the constraints allowed", sides); 


} 

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum > 2) 
     minimumNumberOfSides = minimum; 

} 

-(void)setMaximumNumberOfSides:(int)maximum 
{ 
    if (maximum <= 12) 
     maximumNumberOfSides = maximum; 

} 

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max 
{ 
    if (self = [super init]) 
    { 
     self.minimumNumberOfSides = min; 
     self.maximumNumberOfSides = max; 

     self.numberOfSides = sides; 
    } 
    return self; 
} 

उत्तर

7

यदि आप गेटर और सेटर को लागू करने की योजना बना रहे हैं तो आपको नंबरऑफसाइड्स को संश्लेषित करने की आवश्यकता नहीं है। @synthesize numberOfSides के बिना यदि आप चुनते हैं तो आप एक बूल वापस कर सकते हैं। आपको तदनुसार अपने इंटरफेस में गेटर/सेटर घोषित करने की आवश्यकता होगी।

बीटीडब्ल्यू, एक और दृष्टिकोण संश्लेषित गेटर/सेटर का उपयोग करना होगा और एक अलग विधि -(BOOL)isNumberOfSidesValid जोड़ना होगा जो इस चेक को निष्पादित करता है।

+0

मुझे इसे मारो। +1 –

3

इस तरह की स्थिति में, आप assert() पर एक साधारण कॉल का उपयोग करके बेहतर हो सकते हैं, या अपवाद फेंक सकते हैं।

विकल्प इस वर्ग पर उपयोग करने के तरीके पर निर्भर करेगा। यदि यह लाइब्रेरी का हिस्सा होगा, और आप अन्य डेवलपर्स को minimumNumberOfSides या maximumNumberOfSides के लिए अक्सर गलत मानों की आपूर्ति करने की अपेक्षा करते हैं, तो आपको शायद एक उचित अपवाद फेंकना चाहिए।

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

संपादित करें:

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum <= 2) 
    { 
     [NSException raise:@"invalid minimumNumberOfSides value" 
        format:@"value of %d is too low (must be > 2)", minimum]; 
    } 

    minimumNumberOfSides = minimum; 
} 

संपादित करें: यहाँ another SO question कि ऑब्जेक्टिव-सी में अपवाद हैंडलिंग के बारे में विस्तार में चला जाता है यहाँ कुछ त्वरित नमूना कोड है।

संबंधित मुद्दे