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" و جایگزین‌پذیر است یا نه.