نكمل مبادئ SOLID واليوم مع المبدأ الثالث: Liskov Substitution Principle – LSP
الفكرة بسيطة جداً: أي كلاس يرث من كلاس آخر، لازم نقدر نستخدمه مكانه بدون ما يتغير سلوك النظام.
بمعنى آخر: لو استبدلت الـ Parent بالـ Child، كل شيء لازم يشتغل طبيعي.
❌ مثال غير صحيح:
public class User
{
public virtual void Login()
{
Console.WriteLine("User logged in");
}
}
public class GuestUser : User
{
public override void Login()
{
throw new Exception("Guest cannot login");
}
}
المشكلة هنا: أي كود يتعامل مع User يتوقع أن Login() تعمل بشكل طبيعي، لكن عندما يكون النوع GuestUser يحصل كسر في النظام. وهذا يخالف مبدأ LSP.
✔️ المثال الصحيح:
public abstract class User
{
}
public interface ILoginable
{
void Login();
}
public class NormalUser : User, ILoginable
{
public void Login()
{
Console.WriteLine("User logged in");
}
}
public class GuestUser : User
{
// لا يملك تسجيل دخول
}
بهذا الشكل: فقط المستخدم القادر على تسجيل الدخول يطبق ILoginable، ولا يوجد أي سلوك مكسور، وكل كلاس يمكن استبداله بدون مشاكل.
الخلاصة باختصار
إذا الكلاس الابن يمنع سلوك موجود في الأب أو يغير معناه، فغالبًا أنت كسرت مبدأ LSP.
الوراثة ليست لإعادة استخدام الكود، بل لتمثيل علاقة منطقية صحيحة.


