क्या मैं सही ढंग से समझता हूं कि लिस्कोव सबस्टीट्यूशन प्रिंसिपल को उन भाषाओं में नहीं देखा जा सकता है जहां ऑब्जेक्ट खुद का निरीक्षण कर सकते हैं, जैसे कि डक टाइप की गई भाषाओं में सामान्य क्या है?
उदाहरण के लिए, रूबी में, यदि कोई वर्ग एक वर्ग से B
विरासत में मिला है A
, तो प्रत्येक वस्तु x
के लिए A
, x.class
वापस लौटने वाला है A
, लेकिन यदि x
कोई वस्तु है B
, तो x.class
वह वापस नहीं आने वाली है A
।
यहाँ एलएसपी का एक बयान है:
चलो क्ष (एक्स) एक संपत्ति साध्य हो वस्तुओं के बारे में x प्रकार के टी । तो फिर क्यू (y) साध्य होना चाहिए के लिए वस्तुओं y प्रकार के एस जहां एस की एक उप-प्रकार है टी ।
उदाहरण के लिए, रूबी में,
class T; end
class S < T; end
इस रूप में एलएसपी का उल्लंघन करें, जैसा कि संपत्ति q (x) = द्वारा देखा गया हैx.class.name == 'T'
इसके अलावा। यदि उत्तर "हाँ" (आत्मनिरीक्षण के साथ एलएसपी असंगत) है, तो मेरा दूसरा प्रश्न होगा: क्या एलएसपी का कुछ संशोधित "कमजोर" रूप है जो संभवतः एक गतिशील भाषा के लिए धारण कर सकता है, संभवतः कुछ अतिरिक्त परिस्थितियों में और केवल विशेष प्रकार के साथ। के गुण ।
अपडेट करें। संदर्भ के लिए, यहाँ एलएसपी का एक और सूत्रीकरण है जो मैंने वेब पर पाया है:
आधार वर्गों के लिए संकेत या संदर्भ का उपयोग करने वाले कार्य यह जानने के बिना व्युत्पन्न वर्गों की वस्तुओं का उपयोग करने में सक्षम होना चाहिए।
और दुसरी:
यदि S, T का एक घोषित उपप्रकार है, तो S के प्रकारों की वस्तुओं का व्यवहार करना चाहिए क्योंकि T की वस्तुओं से व्यवहार की अपेक्षा की जाती है, यदि उन्हें टाइप T की वस्तुओं के रूप में माना जाता है।
पिछले एक के साथ एनोटेट किया गया है:
ध्यान दें कि एलएसपी वस्तुओं के अपेक्षित व्यवहार के बारे में है। एलएसपी का पालन केवल तभी किया जा सकता है जब कोई इस बारे में स्पष्ट हो कि वस्तुओं का अपेक्षित व्यवहार क्या है।
ऐसा लगता है कि यह मूल से कमज़ोर है, और इसका अवलोकन करना संभव हो सकता है, लेकिन मैं इसे औपचारिक रूप से देखना चाहूंगा, विशेष रूप से समझाया गया है कि कौन तय करता है कि अपेक्षित व्यवहार क्या है।
क्या एलएसपी एक प्रोग्रामिंग भाषा में वर्गों की एक जोड़ी की संपत्ति नहीं है, लेकिन एक जोड़ी वर्गों के साथ गुणों का एक सेट है, जो पूर्वज वर्ग द्वारा संतुष्ट है? व्यावहारिक रूप से, इसका मतलब यह होगा कि एलएसपी का सम्मान करते हुए एक उपवर्ग (वंशज वर्ग) का निर्माण करना, पूर्वज वर्ग के सभी संभावित उपयोगों को जानना होगा? एलएसपी के अनुसार, पूर्वज वर्ग को किसी भी वंशज वर्ग के साथ बदली माना जाता है, है ना?
अपडेट करें। मैंने पहले ही उत्तर स्वीकार कर लिया है, लेकिन मैं रूबी से एक और ठोस उदाहरण जोड़ना चाहूंगा ताकि प्रश्न का वर्णन किया जा सके। रूबी में, प्रत्येक वर्ग इस अर्थ में एक मॉड्यूल है कि Class
कक्षा वर्ग का एक वंशज है Module
। तथापि:
class C; end
C.is_a?(Module) # => true
C.class # => Class
Class.superclass # => Module
module M; end
M.class # => Module
o = Object.new
o.extend(M) # ok
o.extend(C) # => TypeError: wrong argument type Class (expected Module)