«وراثت» (Inheritance) یکی از اصول مهم در برنامه نویسی شیءگرا است. ارث بری به معنای آن است که کلاس فرزند به تمام صفات و رفتارهای کلاس والد خود دسترسی دارد. زبان سی‌شارپ هم چون زبانی شی‌ءگراست، از ارث‌بری پشتیبانی می‌کند. ارث بری در سی شارپ به توسعه‌دهندگان کمک می‌کند تا به راحتی و با خلاقیت خود، سیستم‌های پیچیده‌ای ایجاد کنند. در دنیای برنامه نویسی، مواردی مانند «قابلیت استفاده دوباره» (Reusability) از کد، سازماندهی هرچه بهتر کدها و توسعه‌‌پذیری، وی‍ژگی‌های بسیار با ارزشی هستند. مفهوم «برنامه نویسی شی گرا» (Object-Oriented Programming | OOP) روش بسیار موثری برای رسیدن به این ویژگی‌ها فراهم کرده است.

فهرست مطالب این نوشته
997696

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

ارث بری در سی شارپ چیست؟

همین‌طور که اشاره کردیم، وراثت یکی از اصول بنیادی شیءگرایی است. با کمک وراثت، امکان استفاده دوباره از کدها به وجود می‌آید. ارث بری در سی شارپ به کلاس‌ها اجازه می‌دهد که صفات یا اعضای داده‌ای و رفتار‌ها یا متدها را از کلاس دیگری به ارث ببرد. به کلاسی که این صفات از او به ارث می‌رسند «کلاس پایه» (Base Class) یا «اَبَرکلاس» (Super Class) گفته می‌شود. کلاسی هم که صفات را به ارث می‌برد به نام «کلاس مشتق شده» (ِDerived Class)، «زیرکلاس» (Subclass) یا کلاس فرزند شناخته می‌‌شود.

برای درک بهتر مفهوم وراثت باید از روابط موجود در دنیای واقعی مثال بزنیم. برای مثال، وسیله نقلیه‌ای را به عنوان کلاس پایه در نظر بگیرید. نام این کلاس پایه را «Vehicle» می‌گذاریم. از کلاس پایه وسیله نقلیه می‌توانیم کلاس‌های خاص‌تری مانند خودرو سواری car، کامیون Truck و موتور سیکلت جدا کنیم. کلاس پایه Vehicle شامل ویژگی‌های عمومی است. این ویژگی‌ها را می‌توان به تمام وسایل نقلیه مشتق شده از آن هم داد. برای مثال می‌‌توانیم به موتور، ترمز، چرخ و غیره اشاره کنیم. اما کلاس‌های مشتق شده ممکن است وی‍ژگی‌هایی داشته باشند که فقط مختص به خود آن‌هاست.
در بخش بعدی مطلب با کمک همین مثال، کلاس‌هایی را نوشته و عمل وراثت را بین آن‌ها پیاده کرده‌ایم.

پیاده سازی ارث بری در سی شارپ چگونه است؟

در زبان برنامه نویسی سی شارپ برای مشخص کردن وراثت و ارث بری بین کلاس‌ها باید از نماد «:» استفاده کنیم. نماد «:» بلافاصله بعد از نام کلاس مشتق شده استفاده می‌شود. بعد از نماد «:» هم باید نام کلاس پایه را بنویسیم.

در مثال بالا، سه کلاس مختلف وسیله نقله Vehicle، ماشین سواری «car » و کامیون «Truck » را نام بردیم. کلاس Vehicle کلاس پایه است. در حالی که دو کلاس دیگر، کلاس‌های مشتق شده یا زیرکلاس هستند. کلاس‌های مشتق شده بعضی از ویژگی‌های خود را از کلاس پایه به ارث می‌برند. در واقع تمام ویژگی‌های کلاس پایه را به ارث می‌برند. اما خودشان هم می‌توانند ویژگی‌های جدیدی داشته باشند.

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

برای کمک به درک بهتر مطلب از مثال‌های کدنویسی شده استفاده کرده‌ایم. در این مثال‌ها، رابطه‌ وراثت با استفاده از علامت «:» پیاده‌سازی شده است.

در کادر پایین، روش پیاده‌سازی رابطه‌ وراثت بین دو موجودیت ساده را نشان داده‌ایم.

بعد از کامپایل شدن و اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

This is the engine of the vehicle
This car is Tiago

در مثال بالا، کلاس Car از کلاس Vehicle ارث بری کرده است. شی c  از کلاس Car ساخته شده است. در این مثال، روش استفاده از شیء c  را هم می‌بینید. با کمک شیء c  به اعضای درون کلاس Vehicle مانند صفت name و متد engine() دسترسی پیدا کرده‌ایم. این دسترسی‌ها به کمک رابطه‌ ارث بری ممکن شده‌اند. همان رابطه ارث بری که بین کلاس والد Vehicle و کلاس فرزند Car تعریف کرده‌ایم.

دلایل استفاده از ارث بری در سی شارپ

در این بخش از مطلب، چند مورد از مهم‌ترین دلایل استفاده از ارث بری در سی شارپ را بیان کرده‌ایم.

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

یاد گرفتن سی شارپ در فرادرس

زبان برنامه‌نویسی سی شارپ (#C) زبانی مدرن، شیء گرا و چندمنظوره‌ است. #C و «NET Framework.» ارتباط بسیار تنگاتنگی با هم دارند. از این زبان برای توسعه نرم‌افزارهای متنوعی مانند برنامه‌های دسکتاپ، برنامه‌های تحت وب، اپلیکیشن‌های موبایل و غیره استفاده می‌شود. در نتیجه، فرادرس مجموعه‌ای از فیلم‌های آموزشی را برای این زبان تهیه کرده است. در وب‌سایت آموزشی فرادرس برای تمام توسعه‌دهندگان مبتدی و حرفه‌ای #C فیلم‌های مفیدی منتشر شده‌اند.

مجموعه آموزش برنامه نویسی سی شارپ C#‎ – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی سی شارپ هدایت شوید.

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

در ادامه مطلب، روش محافظت از متدها و صفات موجود در کلاس‌ها را توضیح داده‌ایم.

اعضای محافظت شده کلاس

کلمه کلیدی «Protected»، «مشخص کننده سطح دسترسی» (Access Specifier) است. این مشخص کننده، همراه با کلاس‌ها متدها یا متغیرها به کار برده می‌‌شود. از Protected، با هدف محدود کردن دسترسی به این مفاهیم در بخش‌های مختلف برنامه استفاده می‌شود.

استفاده از کلمه کلیدی protected در کنار متغیر یا متدها به این معنا است که از این به بعد آن عضو فقط در داخل خود کلاس یا فرزندان آن کلاس قابل دسترسی است. در کادر پایین برای توضیح بهتر این موضوع، مثالی را پیاده‌سازی کرده‌ایم.

بعد از اجرای کد بالا، خروجی به صورت The vehicle will run تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

همین‌طور که در مثال بالا مشاهده می‌شود، متد run() را در کلاس Vehicle به صورت محافظت شده تعریف کرده‌ایم. برای انجام این کار باید از کلمه کلیدی protected استفاده بکنیم. از این به بعد، فقط در داخل کلاس پایه Vehicle یا کلاس‌های مشتق شده از آن – مانند Truck - می‌توان به این متد دسترسی داشت.

انواع ارث بری در سی شارپ

در زبان سی شارپ از انواع مختلفی از وراثت پشتیبانی می‌شود. در فهرست زیر، روش‌های مختلف وراثت را نام برده‌ایم.

  • «وراثت یگانه» (Single Inheritance)
  • «وراثت چندسطحی» (Multilevel Inheritance)
  • «وراثت سلسله‌مراتبی» (Hierarchical Inheritance)
  • «وراثت چندگانه» (Multiple Inheritance)
  • «وراثت ترکیبی» (Hybrid inheritance)
انواع ارث بری در سی شارپ
انواع ارث بری در سی شارپ

در ادامه این بخش از مطلب، تمام روش‌های مختلف پیاده‌سازی وراثت را یک به یک توضیح داده‌ایم.

وراثت یگانه در سی شارپ

در وراثت یگانه کلاس مشتق شده، تمام صفات به ارث برده را فقط از یک کلاس والد یا پایه دریافت کرده است.

وراثت یگانه در سی شارپ
«وراثت یگانه» (Single Inheritance)

همین‌طور که در تصویر بالا دیده می‌شود. کلاس A کلاس والد یا پایه است. کلاس B هم کلاس فرزند یا مشتق شده است. در اینجا کلاس فرزند، تمام صفات و متدها را فقط از یک کلاس والد به ارث می‌برد.

برای درک بهتر مطلب، مثال کدنویسی شده‌ای را بررسی کرده‌ایم.

بعد از اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

A vehicle has an engine.
Car is running.

در مثال بالا، کلاس Car ویژگی‌های خود را فقط از کلاس Vehicle به ارث برده است. بنابراین در کدهای بالا نمونه‌ای از «وراثت یگانه» (Single Inheritance) پیاده‌سازی شده است.

وراثت چندسطحی

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

وراثت چندسطحی - ارث بری در سی شارپ
«وراثت چندسطحی» (Multilevel Inheritance)

با کمک تصویر بالا به وضوح می‌توان این نوع ارث بری را متوجه شد. در این تصویر، کلاس B صفات کلاس A را به ارث برده است. البته به صورت همزمان، نقش کلاس والد را هم برای کلاس C بازی می‌کند.

برای درک بهتر روش پیاده‌سازی این نوع از وراثت در زبان برنامه نویسی سی شارپ به کدهای زیر توجه کنید.

بعد از اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

GrandFather
Father
Son

به عنوان مثالی از دنیای واقعی می‌توان به رابطه بین انسان‌ها اشاره کرد. پدر، صفات و ویژگی‌های خود را از پدربزرگ به ارث برده است. پسر هم همین صفات و ویژگی‌ها را از پدر به ارث می‌برد. می‌بینید که در کدهای بالا رابطه‌ای شبیه به رابطه پدربزرگ، پدر و پسر با استفاده از «وراثت چندسطحی» (Multilevel Inheritance) شبیه‌سازی شده است.

وراثت سلسله‌مراتبی

در این نوع از وراثت، چندین کلاس فرزند مختلف، از یک کلاس والد ارث بری می‌کنند.

وراثت سلسله مراتبی
«وراثت سلسله‌مراتبی» (Hierarchical Inheritance)

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

در کادر زیر، مثالی را برای توضیح وراثت سلسله مراتبی، بررسی کرده‌ایم.

بعد از کامپایل شدن و اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

Students study Science
Students like Physics
Students study Science
Students love Chemistry

در مثال بالا، هر دو کلاس Physics  و Chemistry، از کلاس پایه Science  ارث بری کرده‌اند. در این مثال، نمونه‌ ساده و واضحی از «وراثت سلسله‌مراتبی» (Hierarchical Inheritance) پیاده‌سازی شده است.

وراثت چندگانه

در این نوع از وراثت، کلاس فرزند، می‌تواند صفات مورد نیاز خود را از چندین کلاس والد مختلف به ارث ببرد. به عنوان نکته مهم باید بخاطر داشته باشیم که زبان سی شارپ از وراثت چندگانه، بین کلاس‌ها پشتیبانی نمی‌کند. در عوض از وراثت چندگانه «اینترفیس‌ها» (Interfaces) پشتیبانی می‌کند.

«وراثت چندگانه» (Multiple Inheritance)
«وراثت چندگانه» (Multiple Inheritance)

همین‌طور که در تصویر بالا مشاهده می‌کنیم، کلاس مشتق شده C متدهای خود را از اینترفیس‌های A و B به ارث برده و پیاده‌سازی می‌کند. در بخش‌های بعدی مطلب، مفهوم به ارث بردن متد از اینترفیس و پیاده‌سازی آن را توضیح داده‌ایم.

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

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

بعد از اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

Car is a base class
Bike is a base class
Transport is a derived class

در مثال بالا هر دو گزینه Car و Bike  اینترفیس هستند. کلاس Transport، کلاس مشتق شده‌ای است که صفات هر دو اینترفیس Car و Bike  را به ارث برده است. با توجه به این مثال، متوجه می‌شویم که زبان سی‌شارپ از «وراثت چندگانه» (Multiple Inheritance) پشتیبانی می‌کند. اما این کار فقط با کمک اینترفیس‌ها انجام می‌شود.

وراثت ترکیبی

«وراثت ترکیبی» (Hybrid inheritance) به روشی گفته می‌شود که در آن دو یا چند نوع ارث بری مختلف با هم ترکیب شده باشند. البته سی شارپ از وراثت چندگانه توسط کلاس‌ها پشتیبانی نمی‌کند. در نتیجه ارث بری ترکیبی هم توسط کلاس‌های سی شارپ پشتیبانی نمی‌شود. اما می‌توانیم بر روی اینترفیس‌ها از روش وراثت ترکیبی استفاده کنیم.

«وراثت ترکیبی» (Hybrid inheritance)
«وراثت ترکیبی» (Hybrid inheritance)

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

  1. وراثت سلسله‌مراتبی در بین کلاس‌های A و B و C
  2. وراثت چندگانه در بین کلاس‌های B و C و D

بازنویسی متدها در ارث بری در سی شارپ

گاهی از اوقات ممکن است در هر دو کلاس والد و فرزند، متدی با نام یکسان وجود داشته باشد. در این صورت، متد موجود در کلاس فرزند، متد موجود در کلاس والد یا پایه را بازنویسی می‌کند. به این کار «بازنویسی متد» (Method Overriding) در سی شارپ گفته می‌‌شود.

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

در کادر پایین، مثالی را درباره بازنویسی متدها نوشته‌ایم.

بعد از کامپایل شدن و اجرای کد بالا، خروجی Bike is running تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

همین‌طور که در مثال بالا مشاهده می‌کنید، کلاس‌های Vehicle و Bike  متد یکسانی به نام run()  دارند. از کلاس Bike  شیئی به نام b  ساخته‌ایم وقتی که این متد را با استفاده از شیء b  فراخوانی می‌کنیم، متد run()  موجود در کلاس Bike  اجرا می‌شود. زیرا این متد در کلاس Bike  بازنویسی شده است. مفهوم بازنویسی متد در این مثال، باعث شده که رفتار متد run()  در دو کلاس مختلف، متفاوت باشد.

در کد بالا از کلمات کلیدی virtual  و override  هم در کنار متد run()  استفاده کرده‌ایم.

  • کلمه کلیدی virtual  به معنای آن است که کلاس‌های فزرند می‌توانند متد تعریف شده در کلاس پایه را بازنویسی کنند.
  • کلمه override  هم به معنای آن است که متد نوشته شده در کلاس فرزند، متد موجود در کلاس پایه یا والد خود را بازنویسی می‌کند.

معنی Base در سی شارپ

همین‌طور که در بخش قبل توضیح دادیم، تکنیک «بازنویسی متد» (Method Overriding) متدهای موجود در کلاس پایه را بازنویسی کرده و فقط متد نوشته شده در کلاس فرزند را نمایش می‌دهد. اما شاید در شرایط خاصی بخواهیم از متد کلاس پایه استفاده کنیم.

در چنین حالت‌هایی باید از کلمه کلیدی base در سی شارپ استفاده کنیم. کلمه کلیدی base در سی شارپ، به توسعه‌دهندگان کمک می‌کند که متد موجود در «کلاس پایه» (Base Class) را از طریق کلاس مشتق شده فراخوانی کنند.

چندین کادر رنگی سیاه و رزد سبز و قرمز که با خطوطی به یکدیگر متصل هستند.

در کادر پایین، در ارتباط با این شرایط، مثالی را کدنویسی کرده‌ایم. با کمک این مثال، می‌توان موضوع بالا را بهتر درک کرد.

بعد از اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

Vehicle is running
Bike is running

در مثال بالا، ابتدا از کلاس Bike  شيئی به نام b  ساختیم. سپس با کمک این شیء، متد run()  را فراخوانی کردیم. اما متد نوشته شده در کلاس پایه اجرا می‌شود. این مسئله بخاطر آن است که از کلمه کلیدی base در کلاس مشتق شده Bike استفاده کرده‌ایم. بنابراین هنوز هم متد run()  از کلاس Vehicle اجرا می‌‌شود.

یاد گرفتن سی شارپ با فیلم های پروژه محور در فرادرس

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

برای دیدن سایر فیلم‌ها بر روی تصویر زیر کلیک کرده و به صفحه اصلی این مجموعه آموزشی هدایت شوید.

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

مزایا و محدودیت‌های استفاده از ارث بری در سی شارپ

ارث بری یکی از ویژگی‌های قدرتمند شیءگرایی در سی شارپ است. این ویژگی در عین حال که مزیت‌های زیادی برای کدنویسی فراهم می‌کند، محدودیت‌هایی هم دارد. در این بخش از مطلب، مزیت‌ها و محدودیت‌های ارث بری در سی شارپ را مرور کرده‌ایم.

مزایای ارث بری در سی شارپ

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

  • ماژولار شدن و سازماندهی بهتر کدها: با استفاده از وراثت می‌توانیم در بین کلاس‌‌ها سلسله‌ مراتب ایجاد کنیم. این مسئله به سازماندهی هرچه بهتر کدها کمک می‌کند. همچنین می‌توانیم کدها را به صورت ماژولار بنویسیم. برنامه نویسان با کمک این ویژگی می‌توانند کلاس‌های مرتبط را زیر یک کلاس پایه مشترک تعریف کنند. در نتیجه خوانایی کدها بیشتر شده و به سادگی می‌توان آن‌ها را مدیریت کرد.
  • «قابلیت استفاده دوباره از کدها» (Code Reusability): توسعه‌دهندگان با کمک وراثت از کدهای یکسان به صورت تکراری استفاده می‌کنند. زیرا کلاس‌های فرزند، صفات کلاس‌های والد خود را به کار می‌برند. با این روش، برنامه نویسان دیگر مجبور نیستند که کدهای یکسانی را چند بار و در چند جای مختلف بنویسند. این کار باعث می‌شود نگهداری کدها راحت‌تر و دقیق‌تر انجام شود.
  • «حفاظت از کدها» (Code Maintainance): با کمک وراثت، کلاس والد، صفات خود را به تمام کلاس‌های فرزندش منتقل می‌کند. در نتیجه مجبور نیستیم که برای تغییر دادن رفتار خاصی، یک به یک کلاس‌های فرزند را جداگانه ویرایش کنیم. فقط کافی است که تغییرات مورد نظر خود را در کلاس والد اعمال کنیم. همه کلاس‌ها فرزند از تغییرات جدید استفاده می‌کنند. این مسئله نگهداری کدها را بسیار ساده‌تر می‌کند.

محدودیت‌های وراثت در سی شارپ

مهم‌ترین محدودیت‌های وراثت در سی شارپ را در فهرست پایین جمع‌آوری کرده‌ایم.

  • «ارتباط تنگاتنگ» (Tight Coupling) بین اشیا: وراثت، ارتباط تنگاتنگی بین کلاس‌های پایه و کلاس‌های مشتق شده به وجود می‌آورد. به همین دلیل اگر تغییری در کلاس‌های والد به وجود بیاوریم، بر روی رفتار کلاس‌های فرزند هم اثر می‌گذارد. در نتیجه کلاس‌های فرزند به تمام تغییرات کلاس والد حساس می‌‌شوند.
  • مشکل کلاس پایه ضعیف: اعمال هر تغییری در عملکرد کلاس پایه بر روی رفتار کلاس‌های فرزند تاثیر مستقیم می‌گذارد. این مسئله توان ما را برای تغییر دادن کلاس پایه کم می‌کند. چون کلاس‌های فرزند وابستگی زیادی به کلاس والد دارند، نگهداری کدها کمی دشوارتر می‌شود.
  • افزایش پیچیدگی: وراثت می‌تواند باعث پیچیدگی بیشتر کدها شود. این مسئله به طور خاص وقتی روی می‌دهد که تعداد لایه‌های کلاس‌ها بسیار زیاد شده یا از کدها بیش از حد استفاده دوباره می‌کنیم. سلسله‌مراتب کلاسی به وجود آمده می‌تواند بیش از حد سردرگم کننده شود.
  • نبود وراثت چندگانه: زبان سی شارپ از وراثت چندگانه بین کلاس‌های مختلف پشتیبانی نمی‌کند. اما این زبان از وراثت‌ چندگانه بین اینترفیس‌ها پشتیبانی می‌کند. یعنی اینکه سی شارپ نمی‌تواند برای ساخت کلاس فرزند از کدهای مربوط به چند کلاس مختلف به عنوان کلاس پایه استفاده کند. در نتیجه ساختن بعضی از دیزاین پترن‌ها در زبان سی شارپ سخت‌تر است.
چند مکعب رنگی با خطوط افقی بر روی هر کدام، روی یکدیگر قرار گرفته‌اند - ارث بری در سی شارپ

اینترفیس در سی شارپ

در سی‌شارپ، «اینترفیس» (Interface) مانند قرارداد در نظر گرفته می‌‌شود. این قرارداد فقط فهرستی از متدها، صفات، رویدادها و «اندیس‌گذارها» (Indexers) را مشخص می‌کند. این‌ها مواردی هستند که می‌توان در کلاس‌ها یا نوع Struct پیاده‌سازی کرد. توسعه‌دهندگان نمی‌توانند از روی اینترفیس‌ها شیء ایجاد کنند. اما کلاس‌ها یا Struct می‌توانند از آن‌ برای نوشتن کدهای مورد نیاز خود استفاده کنند. اینترفیس‌ها به افراد برای پیاده‌سازی برنامه نویسی شیءگرا در سی شارپ کمک می‌کنند.

سینتکس تعریف اینترفیس در سی شارپ

برای ساختن Interface در سی شارپ باید از کلمه کلیدی interface استفاده کنیم. سینتکس مورد نیاز برای تعریف interface را در کد زیر نوشته‌ایم.

اگر بخواهیم در پیاده‌سازی کلاسی از اینترفیس استفاده کنیم باید از نماد‌ «:» – همان‌طور که در وراثت استفاده می‌کردیم – استفاده کنیم. در واقع کلاس‌ می‌تواند صفات خود را از اینترفیس به ارث ببرند. در کد زیر، روش ارث‌ بری از اینترفیس را نمایش داده‌ایم.

همین‌طور که مشاهده می‌کنید، در خط اول از کد بالا ابتدا نام کلاس نوشته شده است. سپس علامت «:» قرار گرفته و بعد از آن نام اینترفیس را نوشته‌ایم. در پایین هم توابع موجود در اینترفیس را تعریف کرده‌‌ایم.

مثال برای ارث بری کلاس از اینترفیس

در کدهای زیر، ابتدا اینترفیسی به نام IAnimal  تعریف کرده‌ایم. سپس دو کلاس Cat و Dog صفات و رفتار‌های خود را از اینترفیس IAnimal  به ارث برده‌اند.

بعد از اجرای کد بالا، خروجی زیر تولید شده و در کنسول سی شارپ نمایش داده می‌‌شود.

Dog's name: Spot
The dog barks when he is happy to see me.
The dog moves when he sees his best friend.
Cat's name: Mittens
The cat purrs when I scratch his head.
The cat only moves when there is food in his bowl.

جمع‌بندی

در این مطلب از مجله فرادرس با ارث بری در سی شارپ آشنا شدیم. وراثت به کلاس‌های فرزند کمک می‌کند تا تمام صفات و رفتار‌های – متدها – کلاس‌های والد خود را به ارث ببرند. این مسئله امکان استفاده چندباره از کدها را فراهم می‌کند. برای پیاده‌سازی ارث بری در سی شارپ از نماد «:» استفاده می‌کنیم. از وراثت‌های چندگانه و ترکیبی در سی شارپ می‌توانیم فقط بر روی اینترفیس‌ها استفاده کنیم.

متدهای Protected فقط در کلاس اصلی یا کلاس‌های فرزند آن قابل دسترسی هستند. وقتی که متدی با نام یکسان هم در کلاس والد و هم در کلاس فرزند تعریف شده باشد، دستورات نوشته شده در کلاس فرزند، متد کلاس والد را بازنویسی می‌کنند. به این مسئله «بازنویسی متد» (Method Overriding)‌در سی شارپ گفته می‌شود. کلمه کلیدی base  کمک می‌کند تا متد کلاس والد از داخل کلاس فرزند اجرا شود. حتی اگر در کلاس فرزند هم متدی با همان نام وجود داشته باشد.

source

توسط expressjs.ir