روابط در کلاس‌های شی‌گرا

یک بام و دو هوا

یکی از مفاهیم اصلی شیء‌گرایی، مفهوم وراثت است. به این معنی که یک کلاس می‌تواند از کلاس دیگری مشتق شده یا اصطلاحا ارث‌بری کند. در تجزیه و تحلیل شی‌گرایی مفاهیمی وجود دارند که همگی در یک‌سری خصوصیات و رفتار مشترک هستند. مثلا در یک سیستم ثبت‌نام دانشجویی، اساتید و دانشجویان و مسوولان آموزش همگی دارای برخی صفات خاص (که اختصاصا مربوط به هریک از این موجودیت‌هاست) هستند و یک‌سری صفات بین همه آنها مشترک است، مثلا نام و نام خانوادگی و برخی خصوصیات و روابط دیگر. حالا قرار است سیستم را پیاده‌سازی کنید، آن گاه برای هر موجودیت باید تمام خصوصیات مربوط به آن را بنویسید. آیا منطقی است برای هر موجودیت خصوصیات مشترک را دوباره بنویسیم؟ جواب منفی است!
کد خبر: ۳۸۳۱۹۷

اینجاست که شی‌گرایی به کمک شما می‌آید و با کنار هم قرار دادن خصوصیات و رفتارهای مشترک یک کلاس سطح بالا ایجاد می‌کند و باقی کلاس‌ها از این کلاس به ارث برسند و فقط شامل خصوصیات اختصاصی خود هستند و خصوصیات مشترک مثل نام و نام‌خانوادگی را از کلاس پدر خود ارث می‌برند.

در زبان C++ یک مفهوم وجود دارد، به نام ارث‌بری چندگانه. یعنی چه؟

در مثال بالا یک کلاس از یک کلاس سطح بالاتر از خود به ارث رسیده است. در بعضی مواقع یک کلاس به جای این‌که از یک کلاس به ارث برسد. نیاز است که از چند کلاس به ارث برسد و از هر کدام یک‌سری خصوصیات را به ارث ببرد؛ مثلا یک کلاس Human داریم که خصوصیات یک انسان را در خود نگه می‌دارد. یک کلاس Worker داریم که علاوه بر خصوصیات Human یک‌سری خصوصیات اختصاصی هم دارد. حالا کلاس دیگری داریم به نام Musician خب این کلاس علاوه بر خصوصیات کلاس Human دارای خصوصیات Worker هم است. پس کلاس Musician باید از دو کلاس Human و Worker به ارث برسد. به این می‌گویند ارث‌بری چندگانه، یعنی یک کلاس همزمان از چند کلاس به ارث برسد.

بسیار خب، در زبان‌های شی‌گرای مدرن مانند C# و جاوا این مبحث دیگر وجود ندارد. یعنی یک کلاس نمی‌تواند از یک یا چند کلاس به ارث برسد، اما باید این را یک ضعف در این زبان‌ها قلمداد کرد و آیا ایده طراحان این زبان‌ها برای حذف چه ویژگی‌ای بوده‌ است و چه راه‌حلی برای نبود این ویژگی ارائه داده‌اند. اینجاست که بحث Interface‌ها مطرح می‌شوند. Interface در لغت به معنی رابط است، اما دقیقا به چه معنی است. یک تعریف کلی برای Interface این است که یک Protocol (قانون) برای یک‌سری کلاس است. یعنی یک کلاس از قواعد خاصی تبعیت کند. یعنی چه؟

برمی‌گردیم به همان ارث‌بری. یکی از اهداف ارث‌بری جلوگیری از کد‌های تکراری است. هدف دیگر دادن خط‌مشی به کلاسی که از یک کلاس دیگر به ارث رسیده است، یعنی یک کلاس بداند چه خصوصیات و رفتاری را باید داشته باشد که این رفتار‌ها عمومی هستند. اینها در زمان طراحی کلاس‌ها هستند.

کاربرد دیگر زمان استفاده از یک کلاس است. فرض کنید در همان مثال بالا هر کس باید در دانشگاه ثبت‌نام کند چه استاد باشد چه دانشجو. حالا در برنامه شما قرار است یک متد بنویسید که اطلاعات یک دانشجو را بگیرید و آن را ثبت‌نام کند و همین‌طور یک استاد را. راه‌حل چیست؟ شما 2 متد بنویسید. یکی دانشجو را ثبت کند یکی استاد را و اگر برای مسوول آموزش هم خواستیم می‌نویسیم این کار یک مقدار کد نویسی ما را زیاد می‌کند. راه‌حل این است که یک متد بنویسیم که یک شیء از یک کلاس پدر دانشجو و استاد را بگیرد و عمل ثبت‌نام را انجام دهد. با این کار اگر موجودیت دیگری وارد سیستم شد نیز می‌تواند با استفاده از همان متد قبلی ثبت‌نام شود. خب برگردیم به همان رابط. برای راحتی فهم می‌توان رابط را یک کلاس سطح بالا دانست.

اما رابط یک تفاوت باکلاس دارد آن‌ هم این است که پیاده‌سازی نشده‌ و درواقع یک الگوست. کلاس‌هایی که از یک رابط به ارث می‌رسند، آن رابط را پیاده می‌کنند. یعنی متد‌ها و خصوصیات آن را مطابق دلخواه خود پیاده‌سازی می‌کنند. رابط مانند یک کلاس Abstract است، اما تفاوت‌هایی دارند. یکی از تفاوت‌های عمده آنها در این است که در زبان C#‌ یک کلاس از چند رابط می‌تواند ارث‌بری کند، ولی تنها از کلاس می‌تواند ارث‌بری داشته باشد. پس می‌توان نتیجه گرفت که یک کلاس از یک کلاسAbstract ارث‌بری دارد و از چند رابط هم می‌تواند ارث‌بری داشته باشد. تفاوت دیگر آنها در این است که اجزای یک رابط پیاده‌سازی نمی‌شود، ولی اجزای یک کلاس Abstract می‌تواند پیاده‌سازی شوند.

تفاوت‌های دیگری نیز با هم دارند که مطالعه در مورد آنها بر عهده خواننده گذاشته شده است.

اما چگونه یک رابط را تعریف کنیم و چگونه اجزای یک کلاس که از یک رابط به ارث رسیده ‌است را پیاده‌سازی کنیم. این مباحث را هفته‌های آینده بیشتر بررسی می‌کنیم.

امیربهاالدین سبط‌الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها