पारंपरिक वर्ग पदानुक्रमों की एक प्रसिद्ध कमी यह है कि वास्तविक दुनिया की मॉडलिंग की बात आती है तो वे बुरे हैं। एक उदाहरण के रूप में, कक्षाओं के साथ जानवरों की प्रजातियों का प्रतिनिधित्व करने की कोशिश कर रहा है। ऐसा करते समय वास्तव में कई समस्याएं होती हैं, लेकिन एक ऐसा जो मैंने कभी नहीं देखा जब एक उप-वर्ग एक ऐसे व्यवहार या संपत्ति को खो देता है जिसे एक सुपर-क्लास में परिभाषित किया गया था, जैसे एक पेंगुइन उड़ान भरने में सक्षम नहीं था (वहां शायद बेहतर उदाहरण हैं, लेकिन यह पहला तरीका है जो मेरे दिमाग में आता है)।
एक ओर, आप हर संपत्ति और व्यवहार के लिए परिभाषित नहीं करना चाहते हैं, कुछ ध्वज जो निर्दिष्ट करता है कि यह सभी मौजूद है, और उस व्यवहार या संपत्ति तक पहुंचने से पहले इसे हर बार जांचें। आप बस यह कहना चाहेंगे कि पक्षी वर्ग में, सरल और स्पष्ट रूप से उड़ सकते हैं। लेकिन फिर यह अच्छा होगा यदि कोई "अपवाद" को बाद में परिभाषित कर सकता है, बिना हर जगह कुछ भयानक हैक का उपयोग करने के लिए। यह अक्सर तब होता है जब एक प्रणाली थोड़ी देर के लिए उत्पादक रही है। आपको अचानक एक "अपवाद" मिल जाता है जो मूल डिज़ाइन में बिल्कुल भी फिट नहीं होता है, और आप इसे समायोजित करने के लिए अपने कोड के एक बड़े हिस्से को बदलना नहीं चाहते हैं।
तो, क्या कुछ भाषा या डिज़ाइन पैटर्न हैं जो "सुपर-क्लास" में बड़े बदलावों की आवश्यकता के बिना, और इसको उपयोग करने वाले सभी कोड की आवश्यकता के बिना, इस समस्या को आसानी से संभाल सकते हैं? यहां तक कि अगर एक समाधान केवल एक विशिष्ट मामले को संभालता है, तो कई समाधान एक साथ पूरी रणनीति बना सकते हैं।
अधिक सोचने के बाद, मुझे लगता है कि मैं Liskov प्रतिस्थापन सिद्धांत के बारे में भूल गया। यही कारण है कि आप ऐसा नहीं कर सकते। मान लें कि आप सभी प्रमुख "फ़ीचर समूहों" के लिए "लक्षण / इंटरफेस" को परिभाषित करते हैं, तो आप स्वतंत्र रूप से पदानुक्रम की विभिन्न शाखाओं में लक्षणों को लागू कर सकते हैं, जैसे कि फ्लाइंग विशेषता पक्षियों द्वारा लागू की जा सकती है, और कुछ विशेष प्रकार की गिलहरी और मछली।
तो मेरा प्रश्न "मैं एक विशेषता को कैसे लागू कर सकता हूं?" यदि आपकी सुपर-क्लास एक जावा सीरियल है, तो आपको भी एक होना होगा, भले ही आपके लिए अपने राज्य को क्रमबद्ध करने के लिए कोई रास्ता न हो, उदाहरण के लिए यदि आपने "सॉकेट" शामिल किया हो।
इसे करने का एक तरीका यह है कि आप अपने सभी लक्षणों को शुरू से ही जोड़े में परिभाषित करें: फ्लाइंग और नोटिफाइंग (जो कि UnsupportedOperationException को फेंक देगा, अगर इसके खिलाफ जांच नहीं की गई है)। नहीं-विशेषता किसी भी नए इंटरफ़ेस को परिभाषित नहीं करेगी, और बस के लिए जाँच की जा सकती है। एक "सस्ते" समाधान की तरह लगता है, विशेष रूप से अगर शुरुआत से उपयोग किया जाता है।
" it would be nice if one could define "exceptions" afterward, without having to use some horrible hacks everywhere"
क्या आप व्यवहार को नियंत्रित करने वाली एक फैक्ट्री पद्धति पर विचार करते हैं?
NotSupportedException
से फेंक सकता है Penguin.fly()
।
class Penguin < Bird; undef fly; end;
:। आपको एक और सवाल करना चाहिए या नहीं ।
function save_yourself_from_crashing_airplane(Bird b) { f.fly() }
जो बहुत अधिक जटिल हो जाएगा। (जैसा कि पीटर टॉर्क ने कहा, यह एलएसपी का उल्लंघन करता है)