मान लें कि मेरे पास एक इंटरफ़ेस FooInterface
है जिसमें निम्नलिखित हस्ताक्षर हैं:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
और एक ठोस वर्ग ConcreteFoo
जो उस इंटरफ़ेस को लागू करता है:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
ConcreteFoo::doSomething()
अगर कुछ विशेष प्रकार की SomethingInterface
वस्तु (यह कहते हैं कि यह कहा जाता है SpecialSomething
) पारित कर दिया है, तो मैं कुछ अनूठा करना चाहता हूं ।
यह निश्चित रूप से एलएसपी उल्लंघन है अगर मैं विधि की पूर्व शर्त को मजबूत करता हूं या एक नया अपवाद फेंकता हूं, लेकिन क्या यह अभी भी एलएसपी उल्लंघन होगा यदि मैं SpecialSomething
जेनेरिक SomethingInterface
ऑब्जेक्ट के लिए कमबैक प्रदान करते समय विशेष-कैसड ऑब्जेक्ट? कुछ इस तरह:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()
विधि का उद्देश्य टाइप रूपांतरण होगाSpecialSomething
: यदि यह प्राप्त करता है, तो यहSpecialSomething
केवल वस्तु को अनमॉडिफाइड लौटाएगा, जबकि यदि यह एक सामान्यSomethingInterface
वस्तु प्राप्त करता है, तो यह ऑब्जेक्ट में बदलने के लिए एक एल्गोरिथ्म चलाएगाSpecialSomething
। चूँकि पूर्वधारणाएँ और पदबंध समान हैं, इसलिए मुझे नहीं लगता कि अनुबंध का उल्लंघन किया गया है।