क्या एक वर्ग को अपने उपवर्गों के बारे में पता होना चाहिए? क्या किसी वर्ग को कुछ ऐसा करना चाहिए जो उदाहरण के लिए दिए गए उपवर्ग के लिए विशिष्ट हो?
मेरी वृत्ति मुझे बताती है कि यह एक बुरा डिज़ाइन है, यह किसी प्रकार के विरोधी पैटर्न की तरह लगता है।
क्या एक वर्ग को अपने उपवर्गों के बारे में पता होना चाहिए? क्या किसी वर्ग को कुछ ऐसा करना चाहिए जो उदाहरण के लिए दिए गए उपवर्ग के लिए विशिष्ट हो?
मेरी वृत्ति मुझे बताती है कि यह एक बुरा डिज़ाइन है, यह किसी प्रकार के विरोधी पैटर्न की तरह लगता है।
जवाबों:
कक्षाओं की अवधारणा से निहित उत्तर "नहीं" है।
या तो जो भी कार्रवाई, डेटा या संबंध आप संभाल रहे हैं वह सभी उपवर्गों का हिस्सा है - फिर इसे वास्तविक प्रकार की जांच के बिना सुपरक्लास में संभाला जाना चाहिए। या यह केवल कुछ उपवर्गों पर लागू होता है - फिर आपको सही काम करने के लिए रन-टाइम प्रकार की जाँच करनी होगी, सुपरक्लास को तब बदलना होगा जब कोई अन्य व्यक्ति इसे प्राप्त करता है (या यह चुपचाप गलत काम कर सकता है), व्युत्पन्न वर्गों में परिवर्तन अपरिवर्तित सुपरक्लास को तोड़ सकता है, आदि।
संक्षेप में, आपको कई बुरे परिणाम मिलते हैं जो आमतौर पर ऐसे समाधानों को हाथ से खारिज करने के लिए काफी बुरे होते हैं। यदि आपके कई उपवर्ग एक ही काम करते हैं और आप कोड दोहराव से बचना चाहते हैं (व्यावहारिक रूप से हमेशा एक अच्छी बात है), तो बेहतर उपाय यह है कि एक मध्य-स्तरीय वर्ग शुरू किया जाए, जिसमें से उन सभी उपवर्गों को कोड विरासत में मिले।
इतना ही नहीं पता होना चाहिए , यह बस नहीं कर सकता ! आमतौर पर, एक वर्ग को कभी भी, कहीं भी बढ़ाया जा सकता है। यह उन वर्गों द्वारा बढ़ाया जा सकता है जो तब भी मौजूद नहीं थे जब यह लिखा गया था।
कुछ भाषाएँ सुपरक्लास द्वारा फैली कक्षाओं को नियंत्रित करने की अनुमति देती हैं। स्काला में, एक वर्ग के रूप में चिह्नित किया जा सकता है sealed
, जिसका अर्थ है कि यह केवल उसी संकलन इकाई (स्रोत फ़ाइल) के भीतर अन्य वर्गों द्वारा विस्तारित किया जा सकता है। हालांकि, जब तक कि उपवर्ग भी नहीं हैं sealed
या final
, उपवर्गों को तब अन्य वर्गों द्वारा आगे बढ़ाया जा सकता है।
स्काला में, इसका उपयोग बंद बीजीय डेटा प्रकारों को मॉडल करने के लिए किया जाता है, इसलिए कैनोनिकल हास्केल List
प्रकार:
data List a = Nil | Cons a (List a)
इस तरह स्काला में मॉडलिंग की जा सकती है:
sealed trait List[+A]
case object Nil extends List[Nothing]
final case class Cons[+A] extends List[A]
और आपको लगता है कि गारंटी ले सकते हैं केवल उन दो उप "वर्गों" मौजूद हैं, क्योंकि List
है sealed
और इस प्रकार फ़ाइल की विस्तारित बाहर नहीं किया जा सकता, Cons
है final
और इस तरह बिल्कुल भी नहीं बढ़ाई जा सकती है और Nil
एक है object
जो वैसे भी नहीं बढ़ाई जा सकती।
लेकिन यह एक विशिष्ट उपयोग का मामला है (वंशानुक्रम के माध्यम से बीजीय डेटा प्रकार मॉडलिंग) और यहां तक कि इस मामले में, सुपरक्लास वास्तव में इसके उपवर्गों के बारे में नहीं जानता है। यह उस प्रकार के उपयोगकर्ता के लिए अधिक गारंटी है List
कि यदि वह किसी के साथ भेदभाव करता है Nil
और Cons
, उसकी पीठ के पीछे कोई अन्य वैकल्पिक पॉपिंग नहीं होगी ।
abstract internal
सदस्य को जोड़ रहा है ।
सीधा - सा जवाब है 'नहीं।
यह कोड को भंगुर बनाता है और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के दो बुनियादी सिद्धांतों को आवाज देता है।
हाँ कभी कभी। उदाहरण के लिए, जब सीमित संख्या में उपवर्ग मौजूद होते हैं। एक विज़िटर पैटर्न इस दृष्टिकोण की उपयोगिता का चित्रण है।
उदाहरण: कुछ अच्छी तरह से परिभाषित व्याकरण के एक सार वाक्यविन्यास वृक्ष (एएसटी) नोड्स को Node
सभी नोड प्रकारों को संभालने के लिए एक आगंतुक पैटर्न को लागू करने वाले एकल वर्ग से विरासत में मिला जा सकता है ।
Node
क्लास, निश्चित रूप से, इसके उपवर्गों का कोई सीधा संदर्भ नहीं है। लेकिन इसमें accept
एक Visitor
पैरामीटर के साथ एक विधि शामिल है । और प्रत्येक उपवर्ग Visitor
में एक visit
विधि शामिल है । इसलिए, Node
इसके उपवर्गों का कोई सीधा संदर्भ नहीं होने के बावजूद , यह Visitor
इंटरफ़ेस के माध्यम से अप्रत्यक्ष रूप से उनके बारे में "जानता" है। वे सभी इसके माध्यम से एक साथ युग्मित हुए।
यदि मैं एक फर्म के लिए एक घटक लिखता हूं और बाद में, मेरे जाने के बाद, कोई इसे अपने स्वयं के प्रयोजनों के लिए बढ़ाता है तो क्या मुझे इस बारे में सूचित किया जाना चाहिए?
नहीं!
कक्षाओं के साथ भी। अपनी प्रकृति पर विश्वास रखें।