मान लें कि हमारे पास टास्क संस्थाओं की एक सूची है, और एक ProjectTaskउप प्रकार है। टास्क को कभी भी बंद किया जा सकता है, सिवाय इसके ProjectTasksकि स्टार्ट होने की स्थिति के बाद वे बंद नहीं हो सकते। यूआई को यह सुनिश्चित करना चाहिए कि प्रारंभ को बंद करने का विकल्प ProjectTaskउपलब्ध नहीं है, लेकिन कुछ सुरक्षा उपाय डोमेन में मौजूद हैं:
public class Task
{
public Status Status { get; set; }
public virtual void Close()
{
Status = Status.Closed;
}
}
public class ProjectTask : Task
{
public override void Close()
{
if (Status == Status.Started)
throw new Exception("Cannot close a started Project Task");
base.Close();
}
}
अब जब Close()टास्क पर कॉल किया जा रहा है , तो एक मौका है कि कॉल विफल हो जाएगी अगर यह ProjectTaskशुरू की गई स्थिति के साथ है, जब यह बेस टास्क नहीं होता। लेकिन यह व्यावसायिक आवश्यकताएं हैं। इसे विफल होना चाहिए। क्या इसे लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन माना जा सकता है ?
public Status Status { get; private set; }:; अन्यथा Close()विधि के आसपास काम किया जा सकता है।
Taskकरना कि उपप्रकार पॉलीमॉर्फिक कोड में विचित्र असंगति का परिचय नहीं देते हैं जो केवल जानता है कि Taskयह एक बड़ी बात है। एलएसपी एक सनकी नहीं है, लेकिन बड़ी प्रणालियों में स्थिरता बनाए रखने में मदद करने के लिए ठीक से पेश किया गया था।
TaskCloserप्रक्रिया है closesAllTasks(tasks)। यह प्रक्रिया स्पष्ट रूप से अपवादों को पकड़ने का प्रयास नहीं करती है; आखिरकार, यह स्पष्ट अनुबंध का हिस्सा नहीं है Task.Close()। अब आप परिचय देते हैं ProjectTaskऔर अचानक आपका TaskCloser(संभवतः अखंडित) अपवादों को फेंकना शुरू कर देता है। यह बड़ा सौदा है!