CodeShot
Seniorسختی 4 از ۵· در 55٪ مصاحبه‌های این حوزه پرسیده شده

اصل Liskov Substitution Principle را با یک مثال نقض توضیح دهید.

☆نشان کردن

پاسخ کوتاه

زیرکلاس باید بتواند در هر جایی که کلاس پایه استفاده می‌شود جایگزین شود بدون شکستن رفتار برنامه؛ مثال کلاسیک نقض آن، Rectangle/Square است.

پاسخ کامل

اگر Square از Rectangle ارث‌بری کند و تنظیم عرض را طوری بازنویسی کند که ارتفاع را هم تغییر دهد، کدی که فرض می‌کند تغییر عرض Rectangle روی ارتفاع اثر ندارد، برای Square می‌شکند — یعنی Square نمی‌تواند بی‌خطر جای Rectangle بنشیند.

مثال کد

class Rectangle { public virtual int Width { get; set; } public virtual int Height { get; set; } }
class Square : Rectangle
{
    public override int Width { set { base.Width = value; base.Height = value; } }
}

نکته مهم

راه‌حل رایج: به‌جای ارث‌بری، از ترکیب (Composition) یا یک Abstraction مشترک مناسب‌تر استفاده شود.

اشتباه رایج

❌ استفاده از ارث‌بری فقط برای اشتراک کد، بدون بررسی اینکه رابطه واقعاً "is-a" و جایگزین‌پذیر است یا نه.