این مطلب بخشی از آموزش اصول برنامه نویسی شی گرا هست.
چهارمین مفهوم شی گرایی که بررسی خواهیم کرد چند ریختی (Polymorphism) است. معنای ساده این کلمه داشتن شکل های محتلف هست. چندین شکل برای چند ریختی وجود دارد.
یک نوع از چند ریختی، چند ریختی پویا (Dynamic Polymorphism) یا چند ریختی زمان اجرا (Run-Time Polymorphism) نام دارد. به یک قهوه ساز به عنوان یک کلاس پایه (BasicCoffeeMaker) فکر کنید. این قهوه ساز متدی برای دم کردن (brew) دارد. پارامترهای ورودی برای متد دم کردن شامل قهوه و آب است. فقط لازمه که کمی صبر کنید و خروجی این متد یک لیوان قهوه داغ است!
می توان از یک قهوه ساز برقی برای تهیه قهوه استفاده کرد و یا از یک قهوه ساز دستی (FrenchPress). هر دو قهوه ساز متد دم کردن رو دارن، همچنین ورودی این متدها همان قهوه و آب هست، خروجی هر دو هم یکسان خواهد بود. اما روش دم کردن قهوه در هر یک از قهوه سازها با دیگری متفاوت خواهد بود. اگرچه خروجی های هر دو متد یک لیوان قهوه است ولی ممکن است خصوصیات این دو مانند طعم و غلظت، کمی با یکدیگر فرق داشته باشد.
هنگامی که می خواهیم این نوع چند ریختی را به صورت واقعی پیاده سازی کنیم، روش های مختلفی وجود دارد که می توان انجام داد. قهوه ساز دستی می تواند تمام خصوصیات (Attributes) و متدهای (Methods) قهوه ساز پایه را به ارث ببرد، سپس می تواند متد دم کردن قهوه (brew) را با متد دم کردن خودش جایگزین کنه، به اینکار بازنویسی (Overriding) میگن. این قابلیت به کلاس قهوه ساز دستی (FrenchPress) این امکان رو میده که نسخه منحصر به فرد خودش رو از متد دم کردن (brew) داشته باشه.
ممکنه هر دو این کلاس قهوه سازها از یک کلاس انتزاعی (Abstract Class) با یک متد انتزاعی (Abstract Method) دم کردن استفاده کنند و یا ممکنه هر دو یک واسط (Interface) یکسان رو پیاده سازی کنند
وراثت (Inheritance)، کلاسهای انتزاعی (Abstract Class) و واسطها (Interfaces) همه پیاده سازیهای احتمالی چند ریختی هستند که بعداً به آنها خواهیم پرداخت.
مزیت چند ریختی پویا (Dynamic Polymorphism) اینه که به من این امکان رو میده از هر قهوه سازی که متد دم کردن رو پیاده سازی کرده و ورودیش قهوه و آب هست، بتونم یه لیوان قهوه آماده به عنوان خروجی بگیرم.
شکل متداول دیگه چند ریختی، چند ریختی استاتیک (Static Polymorphism) یا زمان کامپایل (Compile-Time Polymorphism) نامیده می شود و در بسیاری از زبان های برنامه نویسی شی گرا با نام سربار کردن (Overloading) متد استفاده میشه، حواستون باشه که سربارکردن (Overloading) رو با بازنویسی (Overriding) اشتباه نکنید.
سربار کردن (Overloading) به شما این امکان رو میده که بتونید توی یه کلاس چندین متد هم نام داشته باشید ولی با پارامترهای ورودی مختلف. بطور مثال متد دم کردن (brew) رو در کلاس قهوه ساز دستی (FrenchPress) در نظر بگیرید. اگه به عنوان ورودی قهوه و آب را به این متد بدم، خروجی که به من خواهد داد یه لیوان قهوه خواهد بود، ولی اگه به عنوان ورودی چای و آب رو بدم، خروجی چای خواهد بود. دم کردن با قهوه و آب و دم کردن با چای و آب دو متد مختلف هستند و کلاس قهوه ساز دستی (FrenchPress) با توجه به ورودی متدها، انتخاب میکند که کدام متد را اجرا کند.
همچنین می تونید متدهایی با نام یکسان ولی تعداد پارامترهای ورودی مختلف داشته باشید. مثل متد دم کردن با سه ورودی قهوه، چای و آب. در اکثر مواقع متدهای سربار شده کاربردهای مشابه ای دارن.
قسمت قبلی : آموزش اصول برنامه نویسی شی گرا : وراثت (Inheritance)
قسمت بعدی : آموزش اصول برنامه نویسی شی گرا : آنالیز، طراحی و برنامه نویسی