मैं इस तरह से भिक्षुओं के एक भाषा-अज्ञेय वर्णन का उपयोग करने जा रहा हूं , पहले monoids का वर्णन करता हूं:
एक मोनॉइड (लगभग) फ़ंक्शंस का एक सेट है जो किसी प्रकार को एक पैरामीटर के रूप में लेता है और उसी प्रकार को वापस करता है।
एक मोनाड (लगभग) एक फ़ंक्शन का एक सेट है जो एक आवरण प्रकार को एक पैरामीटर के रूप में लेता है और एक ही आवरण प्रकार को वापस करता है।
ध्यान दें कि वे विवरण हैं, न कि परिभाषाएँ। उस विवरण पर हमला करने के लिए स्वतंत्र महसूस करें!
तो एक OO भाषा में, एक संन्यासी ऑपरेशन रचनाओं की अनुमति देता है जैसे:
Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land()
ध्यान दें कि मोनड निहित वर्गों के बजाय उन कार्यों के शब्दार्थों को परिभाषित और नियंत्रित करता है।
परंपरागत रूप से, एक OO भाषा में हम उन शब्दार्थों को प्रदान करने के लिए एक वर्ग पदानुक्रम और विरासत का उपयोग करेंगे। तो हम एक होगा Bird
तरीकों के साथ वर्ग takeOff()
, flyAround()
और land()
, और बतख उन वारिस होगा।
लेकिन फिर हम उड़ान रहित पक्षियों के साथ परेशानी में पड़ जाते हैं, क्योंकि वह penguin.takeOff()
असफल हो जाता है। हमें एक्सेप्शन थ्रोइंग और हैंडलिंग का सहारा लेना होगा।
इसके अलावा, एक बार जब हम कहते हैं कि पेंगुइन एक है Bird
, तो हम कई उत्तराधिकारियों के साथ समस्याओं में भाग लेते हैं, उदाहरण के लिए यदि हमारे पास एक पदानुक्रम है Swimmer
।
अनिवार्य रूप से हम वर्गों को श्रेणियों में डालने की कोशिश कर रहे हैं (श्रेणी सिद्धांत लोगों से माफी के साथ), और व्यक्तिगत कक्षाओं के बजाय श्रेणी द्वारा शब्दार्थ को परिभाषित करें। लेकिन भिक्षुओं को पदानुक्रम की तुलना में ऐसा करने के लिए बहुत स्पष्ट तंत्र की तरह लगता है।
तो इस मामले में, हमारे पास Flier<T>
ऊपर के उदाहरण जैसा एक सनक होगा:
Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land()
... और हम कभी भी तुरंत नहीं करेंगे Flier<Penguin>
। हम इसे रोकने के लिए स्थैतिक टाइपिंग का भी उपयोग कर सकते हैं, शायद एक मार्कर इंटरफ़ेस के साथ। या जमानत के लिए रनटाइम क्षमता-जाँच। लेकिन वास्तव में, एक प्रोग्रामर को कभी भी पेंगुइन को फ्लियर में नहीं डालना चाहिए, उसी अर्थ में उन्हें कभी भी शून्य से विभाजित नहीं करना चाहिए।
इसके अलावा, यह आम तौर पर लागू होता है। एक उड़ाका पक्षी होना जरूरी नहीं है। उदाहरण के लिए Flier<Pterodactyl>
, या Flier<Squirrel>
, उन व्यक्तिगत प्रकारों के शब्दार्थ को बदले बिना।
एक बार जब हम एक कंटेनर पर संयोजकीय कार्यों द्वारा शब्दार्थों को वर्गीकृत करते हैं - बजाय टाइप पदानुक्रम के साथ - यह कक्षाओं के साथ पुरानी समस्याओं को हल करता है जो एक विशेष पदानुक्रम में "किस तरह का, तरह का नहीं" फिट होते हैं। यह आसानी से और स्पष्ट रूप से एक वर्ग के लिए कई शब्दार्थों की अनुमति देता है, Flier<Duck>
साथ ही साथ Swimmer<Duck>
। ऐसा लगता है कि हम वर्ग पदानुक्रम के साथ व्यवहार को वर्गीकृत करके एक प्रतिबाधा बेमेल के साथ संघर्ष कर रहे हैं। मोनाड्स इसे सुरुचिपूर्ण ढंग से संभालते हैं।
तो मेरा सवाल यह है कि जिस तरह से हम विरासत के ऊपर रचना के पक्ष में आए हैं, क्या यह विरासत से अधिक मठों का पक्ष लेने के लिए भी है?
(BTW मुझे यकीन नहीं था कि यह यहाँ या COMP विज्ञान में होना चाहिए, लेकिन यह एक व्यावहारिक मॉडलिंग समस्या की तरह लगता है। लेकिन शायद वहाँ से बेहतर हो।)