روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ امید حاجی ولی
اصل Liskov Substitution مقابل polymorphism
جامعه پی اچ پی ایجاد شده در ۱۶ دی ۱۴۰۰

سلام وقت بخیر خدمت استاد عزیز

بنظر میاد ما اگر بخواهیم اصل Liskov Substitution رو رعایت کنیم نباید از polymorphism در پروژه استفاده کنیم و بالعکس.

چون بر اساس polymorphism ما دقیقا متدهای کلاس پدر رو توی کلاس فرزند override میکنیم که این باعث میشه متد همنام و مشابه کلاس فرزند رفتاری متفاوت با کلاس پدر داشته باشه

لطفاً توضیح بدید که درست متوجه شدم یا نه

سلام.

نه این برداشت درست نیست.

شما میتونید متد رو override کنید منتها در Liskov میگه "ویژگی‌های اصلی" متد رو تغییر نباید داد.

مثلا متد والد هیچ اکسپشنی تولید نمیکنه ولی متد فرزند اکسپشن تولید میکنه. یا مثلا متد والد خروجی نداره و اصطلاحاً void هست ولی متد فرزند خروجی داره... این‌ها مثالهایی هستن که اصل Liskov Substitution رو نقض میکنن.

محسن موحد ۱۶ دی ۱۴۰۰، ۲۳:۴۳

سلام مجدد

اما چیزی که من تو جلسه آموزش polymorphism دیدم استاد گفت وقتی بین فرزندان یک کلاس یکی از کلاسهای فرزند نیاز به رفتار متفاوت در یک متد همنام با بقیه کلاسهای فرزند و کلاس پدر داشته باشه، با override کردن متد پدر این کار رو میکنه. حتی مثالی که تو اون جلسه هم زده شد کاملا در همین راستا بود دو تا کلاس فرزند داشتیم که هر دو در متد draw رفتاری متفاوت با کلاس پدر داشتن!

امید حاجی ولی ۱۸ دی ۱۴۰۰، ۲۱:۰۸

این تعریف که درسته، من در مورد Liskov گفتم موضوع همراستا با پلی مورفیسمه + یه قاعده برای clean code...

البته من کلمه ی "رفتارو" گفتم باعث برداشت اشتباه شده مثل اینکه! باید میگفتم "ویژگی‌های اصلی" و در متن بالا منظور از ویژگی رو هم مثال زدم.

محسن موحد ۱۹ دی ۱۴۰۰، ۰۲:۰۳