تكرار السؤال: …
الإجابة المختصرة
ينص LSP على أن كائنات الفئة المشتقة يجب أن تحل محل كائنات الفئة الأساسية دون تغيير صحة وسلوك البرنامج. ولا يجوز للابن تشديد الشروط المسبقة أو إضعاف الشروط اللاحقة.
الشرح
المثال الكلاسيكي: كلاس Square ترث من Rectangle. إذا قمت بتغيير setWidth() في المربع، فإنك مجبر على تغيير height أيضاً للحفاظ على التساوي. لكن الكود الذي يتعامل مع Rectangle يتوقع أن تغيير العرض لا يؤثر على الارتفاع! عند استبدال المستطيل بمربع ينكسر منطق الحسابات. قواعد لسكوف الصارمة: (1) الشروط المسبقة لا يمكن تقويتها في الابن. (2) الشروط اللاحقة لا يمكن إضعافها. (3) ثوابت الفئة (Invariants) يجب الحفاظ عليها بالكامل. (4) لا يجوز رمي استثناءات غير متوقعة في الفئة الأب.
مثال بالكود
class Rectangle {
constructor(protected w: number, protected h: number) {}
setWidth(val: number) { this.w = val; }
setHeight(val: number) { this.h = val; }
getArea(): number { return this.w * this.h; }
}
// انتهاك LSP: المربع يغير سلوك الارتفاع خفية عند تغيير العرض!أخطاء شائعة
- وراثة فئة ورمي NotImplementedException في بعض دوالها، وهو انتهاك مباشر لمبدأ لسكوف يكسر توقعات المستدعي.