एक उपवर्ग माता-पिता के व्यवहार में परिवर्तन नहीं करना चाहिए?
यह एलएसपी की एक आम गलत व्याख्या है। एक उपवर्ग माता-पिता के व्यवहार को बदल सकता है, जब तक कि यह मूल प्रकार के लिए सही रहता है।
विकिपीडिया पर एक अच्छी लम्बी व्याख्या है , उन चीजों के बारे में सुझाव दे रही है जो एलएसपी का उल्लंघन करेंगी:
... वहाँ व्यवहार स्थितियों की एक संख्या है कि उपप्रकार मिलना चाहिए। ये अनुबंध कार्यप्रणाली द्वारा डिज़ाइन की गई शब्दावली में विस्तृत हैं, कुछ प्रतिबंधों के लिए अग्रणी हैं जो अनुबंध विरासत के साथ कैसे बातचीत कर सकते हैं:
- उपसर्गों को एक उपप्रकार में मजबूत नहीं किया जा सकता है।
- उपसंहार को उपप्रकार में कमजोर नहीं किया जा सकता है।
- सुपरपाइप के हमलावर को उपप्रकार में संरक्षित किया जाना चाहिए।
- इतिहास की बाधा ("इतिहास का नियम")। वस्तुओं को केवल उनके तरीकों (एनकैप्सुलेशन) के माध्यम से परिवर्तनीय माना जाता है। चूंकि उपप्रकार उन विधियों को प्रस्तुत कर सकता है जो सुपरटाइप में मौजूद नहीं हैं, इसलिए इन विधियों का परिचय उपप्रकार में राज्य परिवर्तन की अनुमति दे सकता है जो सुपरटाइप में अनुमेय नहीं हैं। इतिहास की बाधा इस पर रोक लगाती है। यह लिस्कोव और विंग द्वारा प्रस्तुत उपन्यास तत्व था। इस बाधा के उल्लंघन को एक म्यूचुलेबेल को एक इम्यूटेबल के उपप्रकार के रूप में परिभाषित करके किया जा सकता है। यह इतिहास की कमी का उल्लंघन है, क्योंकि अपरिवर्तनीय बिंदु के इतिहास में, राज्य हमेशा निर्माण के बाद एक ही होता है, इसलिए यह सामान्य रूप से एक म्यूएटेलेप का इतिहास शामिल नहीं कर सकता है। सबटाइप में जोड़े गए फ़ील्ड को हालांकि सुरक्षित रूप से संशोधित किया जा सकता है क्योंकि वे सुपरपाइप विधियों के माध्यम से देखने योग्य नहीं हैं।
व्यक्तिगत रूप से, मुझे यह याद रखना आसान लगता है: यदि मैं एक ऐसी विधि में एक पैरामीटर देख रहा हूं जिसमें A टाइप है, तो क्या कोई उपप्रकार बी पास करने से मुझे कोई आश्चर्य होगा? यदि वे तब एलएसपी का उल्लंघन होता है।
क्या एक अपवाद को आश्चर्यचकित करना है? ज़रुरी नहीं। यह ऐसा कुछ है जो किसी भी समय हो सकता है, चाहे मैं ऑर्डरस्टोर या ग्रांटेड या शिप पर शिप विधि कह रहा हूं। इसलिए मुझे इसका हिसाब देना होगा और यह वास्तव में एलएसपी का उल्लंघन नहीं है।
उन्होंने कहा , मुझे लगता है कि इस स्थिति को संभालने के बेहतर तरीके हैं। अगर मैं इसे C # में लिख रहा था, तो मैं विधि को कॉल करने से पहले इंटरफ़ेस के कार्यान्वयन के लिए इंटरफेस और जांच का उपयोग करूंगा। उदाहरण के लिए, यदि वर्तमान ऑर्डरस्टेबल लागू नहीं होता है, तो उस पर एक शिप विधि न कहें।
लेकिन तब मैं इस विशेष स्थिति के लिए राज्य के पैटर्न का उपयोग नहीं करता। राज्य का पैटर्न इस तरह के डोमेन ऑब्जेक्ट की स्थिति की तुलना में किसी एप्लिकेशन की स्थिति के लिए बहुत अधिक उपयुक्त है।
इसलिए, संक्षेप में, यह राज्य पैटर्न का एक खराब रूप से वंचित उदाहरण है और एक आदेश की स्थिति को संभालने के लिए विशेष रूप से अच्छा तरीका नहीं है। लेकिन यह यकीनन एलएसपी को भंग नहीं करता है। और राज्य पैटर्न, और खुद में, निश्चित रूप से नहीं करता है।