2013-01-08 14 views
8

जावा और सी ++ जैसी भाषाओं में हम निर्माता को पैरामीटर देते हैं।स्मॉलटॉक प्रारंभिक चर

आप फारो स्मॉलटॉक में यह कैसे करते हैं?

मैं चाहता हूँ की तरह

|aColor| 
aColor = Color new 'red'. 

कुछ या यह बुरा व्यवहार है और मैं हमेशा

|aColor| 
aColor = Color new. 
aColor name:= red.d 

उत्तर

12

एस हॉर्ट उत्तर यह है कि आप स्मॉलटाक में काफी कुछ कर सकते हैं। बुला कोड से यह देखने के लिए की तरह होगा: उत्तर है

aColor := Color named: 'Red'. 

कि स्मालटाक में आप कंस्ट्रक्टर्स की जरूरत नहीं है, कम से कम समझ में आप एक विशेष संदेश वर्ग के नाम पर रखा है कि में नहीं है। स्मॉलटाक में आप जो करते हैं वह क्लास-साइड संदेशों को परिभाषित करता है (यानी वर्ग द्वारा समझा गया संदेश, उदाहरण नहीं [*]) जहां आप अपने उदाहरणों को तुरंत चालू और कॉन्फ़िगर कर सकते हैं। नोट करने के लिए

(class) Color>>named: aName 
| color | 
color := self new. 
color name: aName. 
^color. 

कुछ बातें:

  • हम #new संदेश भेजा प्रयोग कर रहे हैं मान लिया जाये कि अपने Color वर्ग एक name उदाहरण चर और इसके लिए एक सेटर है, #named: विधि की तरह लागू किया जाएगा एक नया उदाहरण बनाने के लिए कक्षा। आप वस्तुओं को बनाने के लिए #new संदेश के बारे में सोच सकते हैं (संकेत: आप #new संदेश के कार्यान्वयनकर्ताओं को यह देखने के लिए ब्राउज़ कर सकते हैं कि यह कैसे कार्यान्वित किया जाता है)।
  • हम कई वर्ग विधियों को परिभाषित कर सकते हैं क्योंकि हम नए 'कॉन्फ़िगर किए गए' उदाहरण (उदा। Color fromHexa:) बनाना चाहते हैं या पूर्व-निर्मित वाले (जैसे Color blue) वापस करना चाहते हैं।
  • आप अभी भी Color new कर एक अनियमित उदाहरण बना सकते हैं। यदि आप उस व्यवहार को मना करना चाहते हैं तो आपको #new क्लास संदेश ओवरराइड करना होगा।

कई अच्छी किताबें स्मालटाक पर ओर्थोगोनल प्रकृति के कारण है कि आप Stef's Free Online Smalltalk Books

[*] यह काफी स्वाभाविक है पर स्मालटाक बुनियादी बातों के बारे पढ़ सकते हैं सब कुछ के बाद से (सहित वर्ग) के होते हैं, एक वस्तु है। यदि आप रुचि रखते हैं तो Pharo by Example के अध्याय 13 या स्मॉलटाक में कक्षाओं और मेटाक्लास के किसी भी अन्य संदर्भ की जांच करें।

HTH

+1

भी अच्छी बात किसी भी setters, और एक ही प्रारंभ पद्धति के रूप में की जरूरत parameterised होने नहीं कर रहा है: इस मामले में ':' रंग >> #initializeWithName। –

+1

बिट को स्पष्ट करने के लिए, कक्षा एक वस्तु है, उदाहरण एक और वस्तु है। Encapsulation का सम्मान करने के लिए, कक्षा के उदाहरण के उदाहरण चर के लिए कोई पहुंच नहीं है - संदेश भेजने के माध्यम से कृपया पूछना छोड़कर। यह बहुत समान है, स्मॉलटाक ऐसे बुनियादी कर्नेल कार्यों के लिए भी संदेश भेजने के बारे में है ... फ्रैंकशेरार ने कहा, उदाहरण के लिए एक संदेश होना बेहतर हो सकता है जो एक ही समय में सभी चर सेट करता है, यह निर्णय लेने वालों के लिए है। –

+0

फ्रैंकशेरार और उर्फ.निस, उत्तर में सुधार के लिए धन्यवाद –

3

करना चाहिए स्मालटाक में सभी सदस्य खेतों सख्ती से निजी हैं और आप करना होगा उन्हें आवंटित करने के लिए असाइनिंग विधियों को परिभाषित करें।

Color >> name: aString 
    name := aString 

तो फिर तुम इस तरह से अपनी वस्तु बना सकते हैं:

|aColor| 
aColor := (Color new) 
    name: 'red'; 
    yourself. 

आमतौर पर कम करने के लिए शब्दाडंबर कारखाने विधि का इस्तेमाल किया जाता है:

Color class >> withName: aName 
^(self new) 
    name: aName; 
    yourself. 

इसके साथ ही आप इस तरह नई वस्तुओं बना सकते हैं:

|aColor| 
aColor := Color withName: 'red'. 
संबंधित मुद्दे