मान लें कि मेरे पास एक इंटरफ़ेस 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। चूँकि पूर्वधारणाएँ और पदबंध समान हैं, इसलिए मुझे नहीं लगता कि अनुबंध का उल्लंघन किया गया है।