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