c# - Inheritance and Liskov substitution principle -


मैं अपनी कक्षा संरचना बनाते समय Liskov प्रतिस्थापन सिद्धांत का पालन करने के लिए संघर्ष कर रहा हूँ। मुझे एक डे क्लास के भीतर संग्रहीत कैलेंडर आइटम्स का संग्रह करना है। कई अलग-अलग प्रकार के कैलेंडर आइटम होने की जरूरत है जैसे:

नियुक्तिआईटम
नोटआईटीम
रोटाइटम

वे सभी कुछ सामान्य कार्यक्षमता साझा करते हैं जो कि प्रस्तुत नहीं है सार बेस क्लास कैलेंडर इवेंट में:

  सार्वजनिक अमूर्त वर्ग CalendarBaseItem {सार्वजनिक स्ट्रिंग विवरण {get; निजी सेट; } सार्वजनिक सूची & lt; स्ट्रिंग & gt; नोट्स {प्राप्त करें; निजी सेट; } सार्वजनिक समय सत्र प्रारंभ समय {प्राप्त करें; निजी सेट; } सार्वजनिक टाइमस्पेन एंडटाइम {प्राप्त करें; निजी सेट; } सार्वजनिक int आईडी {प्राप्त करें; निजी सेट; } सार्वजनिक दिनांक समय तिथि {प्राप्त करें; निजी सेट; } कोड छोड़े गए ...}   

लेकिन फिर उदाहरण के लिए, RotaItem में कुछ अतिरिक्त कार्यक्षमता है:

  सार्वजनिक वर्ग RotaItem: CalendarBaseItem {सार्वजनिक स्ट्रिंग RotaName {get; निजी सेट; } प्राइवेट बूल स्पन्स टू डेज; सार्वजनिक बूल स्पानटाओडे () {इस। स्पैन दो दिन लौटें; }}   

अन्य वर्गों में भी अपना तर्क इत्यादि भी शामिल है।

मेरे पास मेरे दिन वर्ग के लिए CalendarBaseItem का एक संग्रह है:

  सूची से & lt; CalendarBaseItem & gt; calendarItems;   

लेकिन इस पर समीक्षा करने पर मैं देख सकता हूं कि मैं एलएसपी सिद्धांतों को तोड़ रहा हूं क्योंकि मुझे प्रत्येक कंक्रीट प्रकार की कार्यक्षमता प्राप्त करने की आवश्यकता है जो मुझे प्रत्येक उपवर्ग के लिए चाहिए।

अगर कोई इस समस्या से बचने की सलाह दे सकता है तो मैं आभारी रहूंगा। क्या मुझे एक रचना दृष्टिकोण का उपयोग करना चाहिए और अंतिम वर्गों में से प्रत्येक के लिए एक कैलेंडर इटम वर्ग जोड़ना चाहिए उदा ..

  सार्वजनिक वर्ग RotaItem {निजी CalendarBaseItem baseItem; सार्वजनिक स्ट्रिंग RotaName {get; निजी सेट; } प्राइवेट बूल स्पन्स टू डेज; सार्वजनिक रोटाइटम (आधारअर्ज, रोटाएरग्स) {baseItem = नया कैलेंडरबेजइटम (आधारअर्ग); } सार्वजनिक बूल स्पानटाओडे () {इस। स्पैन दो दिन लौटें; }}   

एकमात्र समस्या यह है कि मेरे दिन वर्ग में प्रत्येक कंक्रीट कैलेंडर आईटम के लिए मुझे एक अलग संग्रह की आवश्यकता होगी?

मुझे लगता है कि आप जो भी सामना कर रहे हैं वह बहुत ज्यादा नहीं है, लिस्कोव प्रतिबंधात्मक सिद्धांत उल्लंघन, जैसा कि आप अधिकांश भाषाओं में बहुरूपता सीमा का सामना कर रहे हैं।

जैसे सूची & lt; CalendarBaseItem & gt; संकलक inferring है कि आप केवल CalendarBaseItem के साथ काम कर रहे हैं, जो स्पष्ट रूप से अगर CalendarBaseItem लेकिन यह एक दृढ़ता से टाइप की गई भाषा है: यह केवल कैलेंडरबेसईटीम के बारे में बताया गया है, ताकि इसका उपयोग क्या सीमित हो।

ऐसे पैटर्न हैं जो आपको इस प्रकार से निपटने की अनुमति देते हैं सीमा का सबसे लोकप्रिय डबल-डिस्पैच पैटर्न है: कई प्रेषणों की विशेषज्ञता जो कि प्रेषण विधि को रन-टाइम प्रकार बताती है। यह एक ओवरराइड प्रदान करके पूरा किया जा सकता है, जब प्रेषित किया गया, इच्छित विधि भेजता है (यानी "डबल डिस्पैच")। विस्तार की कमी के कारण, आपके परिस्थितियों में ठीक से जुड़ना मुश्किल है लेकिन, यदि आप कुछ प्रकार के अन्य प्रकार के आधार पर कुछ प्रसंस्करण करना चाहते हैं उदाहरण के लिए:

  सार्वजनिक अमूर्त वर्ग CalendarBaseItem {सार शून्य प्रक्रिया (SomeData somedata); // ...} पब्लिक क्लास RotaItem: CalendarBaseItem {सार्वजनिक ओवरराइड शून्य प्रक्रिया (SomeData somedata) {// अब हम जानते हैं कि हम एक `RotaItem` उदाहरण के साथ काम कर रहे हैं, // और विशेष प्रक्रिया आईटम को कुछ डाटा कहा जा सकता है। प्रोसेस आईटम ( इस); } // ...} सार्वजनिक वर्ग SomeData {सार्वजनिक void ProcessItem (RotaItem आइटम) {// ...} सार्वजनिक void ProcessItem (NoteItem आइटम) {// ...}}   

जो कुछ की तरह प्रतिस्थापित करेगा:

  var someData = new SomeData (); विदेशी मुद्रा (कैलेंडर आइटम में विभिन्न आइटम) someData.ProcessItem (आइटम);   

अब, यह सी # में करने का "शास्त्रीय" तरीका है - जो सी # के सभी संस्करणों को फैलाते हैं। सी # 4 के साथ रन-टाइम प्रकार मूल्यांकन की अनुमति देने के लिए गतिशील कीवर्ड पेश किया गया था इसलिए, आप अपने आइटम को गतिशील पर कास्ट करके डबल-प्रेषण लिखने के लिए बिना क्या कर सकते हैं। जो रन-टाइम में विधि मूल्यांकन को उत्पन्न करता है और इस प्रकार विशेष ओवरराइड को चुना जाएगा:

  var someData = new SomeData (); फोरहैक (कैलेंडर आइटम में विविध आइटम) कुछ डेटा। प्रोसेस आईटम ((गतिशील) आइटम);   

यह संभावित रन-टाइम अपवाद पेश करता है जो आप को पकड़ना और निपटना चाहते हैं - यही वजह है कि कुछ लोगों को यह इतना पसंद नहीं है यह वर्तमान में बहुत धीमा है, इसलिए इसे तंग लूपों में अनुशंसित नहीं किया जाता है जो प्रदर्शन संवेदनशील होते हैं।

Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -