در زبان برنامهنویسی سیشارپ، ارثبری نقش مهمی در ساختاردهی کد و مدیریت بهتر پروژهها ایفا میکند. از ارثبری تکسطحی گرفته تا ارثبری ترکیبی، انواع مختلف ارث بری در سی شارپ به برنامهنویسان کمک میکنند تا کدهای قابل فهمتر، کارآمدتر و با قابلیت نگهداری بالاتر بنویسند. در این مقاله از مجموعه مقالات آموزشی پی استور به بررسی انواع ارث بری در سی شارپ، مفاهیم مرتبط با آن، مزایا و معایب این موضوع مهم میپردازیم.
ارث بری در سی شارپ چیست؟
ارث بری در سی شارپ یک مفهوم اساسی در برنامهنویسی شیءگرا است که که امکان استفاده مجدد از کد، گسترش ویژگیها و بهبود سازماندهی برنامهها را فراهم میکند. این مفهوم به یک کلاس فرزند اجازه میدهد ویژگیها و متدهای کلاس والد را به ارث ببرد. کلاس جدید ویژگیها و متدهای کلاس موجود را به ارث میبرد و میتواند ویژگیها و متدهای جدیدی نیز به آن اضافه کند. ارثبری باعث استفاده مجدد از کد، سادهتر شدن نگهداری کد و بهبود سازماندهی کد میشود.
ساختار یا نحو ارث بری در سی شارپ
برای ایجاد ارثبری در سیشارپ، کلاس فرزند باید پس از نام کلاس والد از علامت : استفاده کند. ساختار ارث بری در سی شارپ به صورت زیر است:
class derived-class : parent-class { // methods and fields }
کلاس مشتقشده: کلاسی که از کلاس دیگری ارثبری میکند، به عنوان کلاس فرزند (یا کلاس مشتقشده، کلاس توسعهیافته یا کلاس زیرمجموعه) شناخته میشود. کلاس فرزند میتواند علاوه بر ویژگیها و متدهای کلاس والد، فیلدها و متدهای خود را نیز اضافه کند.
کلاس والد: کلاسی که ویژگیهای آن به ارث برده میشود، به عنوان کلاس والد (یا کلاس پایه یا کلاس ابر) شناخته میشود.
مثال ارث بری در سی شارپ
تکه کد زیر نمونهای از ارث بری در سی شارپ است. در این کد یک کلاس پایه (PgS) داریم که دارای ویژگیها و متدی است، و سپس یک کلاس مشتق شده (ProgramStore) که از کلاس پایه ارث میبرد. در مثال زیر، کد نحوه استفاده از ارثبری و دسترسی به متدها و ویژگیهای کلاس پایه از طریق کلاس مشتق شده را نشان میدهد.
// Demonstration of Inheritance using System; // Base class class PgS { // Data members public string name; public string subject; public void readers(string name, string subject) { this.name = name; this.subject = subject; Console.WriteLine("Myself: " + name); Console.WriteLine("My Favorite Subject is: " + subject); } } // Inheriting the PgS class class ProgramStore : PgS { // Constructor of derived class public ProgramStore() { Console.WriteLine("ProgramStore"); } } class PStore { static void Main(string[] args) { // Child class object ProgramStore g = new ProgramStore(); // Calling the method of base class // using the derived class object g.readers("hosseinpur", "C#"); } }
خروجی
ProgramStore Myself: hosseinpur My Favorite Subject is: C#
در مثال بالا کلاسی که از PgS ارث میبرد میتواند از متدهای PgS بدون نیاز به بازنویسی آنها استفاده کند.
انواع ارث بری در سی شارپ
در سیشارپ، به طور کلی ۴ نوع ارثبری وجود دارد که در زیر توضیح داده شدهاند:
- ارثبری تکسطحی (Single Inheritance): یک کلاس مشتقشده که فقط از یک کلاس پایه ارثبری میکند.
- ارثبری چندسطحی (Multi-level Inheritance): یک کلاس مشتقشده که از یک کلاس پایه ارثبری میکند و سپس خود این کلاس مشتقشده به عنوان کلاس پایه برای کلاس مشتقشده دیگری عمل میکند.
- ارثبری سلسلهمراتبی (Hierarchical Inheritance): یک کلاس پایه که به عنوان کلاس والد برای دو یا چند کلاس مشتقشده عمل میکند.
- ارثبری چندگانه (Multiple Inheritance): یک کلاس مشتقشده که از دو یا چند کلاس پایه ارثبری میکند (با استفاده از اینترفیس).
- ارثبری ترکیبی (Hybrid Inheritance): ارثبری ترکیبی ترکیبی از دو یا چند نوع ارثبری است.
۱. ارث بری تک سطحی در سی شارپ
در ارثبری تکسطحی، کلاسهای فرزند ویژگیهای یک کلاس والد را به ارث میبرند. در تصویر زیر، کلاس A به عنوان کلاس پایه برای کلاس مشتقشده B عمل میکند.
۲. ارث بری چندسطحی در سی شارپ
در ارثبری چندسطحی، یک کلاس مشتقشده ویژگیهای یک کلاس پایه را به ارث میبرد و همچنین خود این کلاس مشتقشده به عنوان کلاس پایه برای کلاس دیگری عمل میکند.
در تصویر زیر، کلاس A به عنوان کلاس پایه برای کلاس مشتقشده B عمل میکند و کلاس B به عنوان کلاس پایه برای کلاس مشتقشده C عمل میکند.
۳. ارث بری سلسله مراتبی در سی شارپ
در ارثبری سلسلهمراتبی، یک کلاس به عنوان کلاس والد (کلاس پایه) برای بیش از یک کلاس فرزند عمل میکند.
در تصویر زیر، کلاس A به عنوان کلاس پایه برای کلاسهای مشتقشده B، C، و D عمل میکند.
۴. ارث بری چندگانه در سی شارپ
در ارثبری چندگانه، یک کلاس میتواند بیش از یک کلاس والد داشته باشد و ویژگیهای همه کلاسهای والد را به ارث ببرد.
توجه داشته باشید که سیشارپ ارثبری چندگانه را برای کلاسها پشتیبانی نمیکند. در سیشارپ، ارثبری چندگانه فقط از طریق اینترفیسها قابل دستیابی است.
در تصویر زیر، کلاس C از اینترفیسهای A و B مشتق شده است.
۵. ارث بری ترکیبی در سی شارپ
ارثبری «Inheritance» ترکیبی ترکیبی از دو یا چند نوع از انواع ارثبری بالا است.
از آنجا که سیشارپ از ارثبری چندگانه برای کلاسها پشتیبانی نمیکند، ارثبری ترکیبی نیز با استفاده از کلاسها امکانپذیر نیست.
در سیشارپ، ارثبری ترکیبی تنها از طریق اینترفیسها قابل دستیابی است.
مثال: قطعه کد زیر نمونههایی از انواع ارثبری در زبان برنامهنویسی C# را نشان میدهد. به طور کلی، ارثبری به این معناست که یک کلاس ویژگیها و متدهای یک کلاس دیگر را به ارث میبرد.
// Different types of Inheritance using System; // Single Inheritance class Animal { public void Eat() { Console.WriteLine("Animal is eating."); } } class Dog : Animal { public void Bark() { Console.WriteLine("Dog is barking."); } } // Multi-level Inheritance class Mammal : Animal { public void Run() { Console.WriteLine("Mammal is running."); } } class Horse : Mammal { public void Gallop() { Console.WriteLine("Horse is galloping."); } } // Hierarchical Inheritance class Bird : Animal { public void Fly() { Console.WriteLine("Bird is flying."); } } class Eagle : Bird { public void Hunt() { Console.WriteLine("Eagle is hunting."); } } class Penguin : Bird { public void Swim() { Console.WriteLine("Penguin is swimming."); } } // Multiple Inheritance interface I1 { void Method1(); } interface I2 { void Method2(); } class MyClass : I1, I2 { public void Method1() { Console.WriteLine("Method1 is called."); } public void Method2() { Console.WriteLine("Method2 is called."); } } class Geeks { // Main Method static void Main(string[] args) { // single inheritance Dog dog = new Dog(); dog.Eat(); // multi-level inheritance Horse horse = new Horse(); horse.Eat(); horse.Run(); // hierarchical inheritance Eagle eagle = new Eagle(); Penguin penguin = new Penguin(); eagle.Fly(); eagle.Hunt(); penguin.Fly(); penguin.Swim(); // multiple inheritance MyClass myClass = new MyClass(); myClass.Method1(); myClass.Method2(); Console.ReadLine(); } }
خروجی
Animal is eating. Animal is eating. Mammal is running. Bird is flying. Eagle is hunting. Bird is flying. Penguin is swimming. Method1 is called. Method2 is called
مفاهیم مهم ارث بری در سی شارپ
- کلاس والد پیشفرض «Default Superclass»: به جز کلاس Object که هیچ کلاس والدی ندارد، هر کلاس یک و فقط یک کلاس والد مستقیم دارد (ارثبری تکسطحی). در صورت عدم وجود کلاس والد مشخص، هر کلاس به طور ضمنی زیرکلاس کلاس Object است.
- ارثبری چندگانه «Multiple Inheritance»: یک کلاس والد میتواند هر تعداد زیرکلاس داشته باشد. اما یک زیرکلاس فقط میتواند یک کلاس والد داشته باشد، زیرا سیشارپ ارثبری چندگانه را برای کلاسها پشتیبانی نمیکند. با این حال، ارثبری چندگانه از طریق اینترفیسها در سیشارپ امکانپذیر است.
- ارثبری سازندهها «Inheriting Constructors»: یک زیرکلاس تمام اعضا (فیلدها و متدها) را از کلاس والد خود به ارث میبرد. سازندهها به عنوان اعضای کلاس در نظر گرفته نمیشوند، بنابراین توسط زیرکلاسها به ارث برده نمیشوند. با این وجود، سازنده کلاس والد میتواند از زیرکلاس فراخوانی شود.
اعضای خصوصی «Private Members»: یک زیرکلاس اعضای خصوصی کلاس والد خود را به ارث نمیبرد. با این حال، اگر کلاس والد متدهای get و set برای دسترسی به فیلدهای خصوصی خود داشته باشد، زیرکلاس میتواند از آنها استفاده کند.
مزایای ارث بری در سی شارپ
- قابلیت استفاده مجدد از کد «Code Reusability»: ارثبری به ما امکان میدهد ویژگیها و متدهای یک کلاس موجود را به ارث ببریم و از کد موجود دوباره استفاده کنیم.
- نگهداری آسان کد «Code Maintenance»: ارثبری نگهداری کد را سادهتر میکند، زیرا تغییرات اعمالشده در کلاس پایه به طور خودکار در کلاسهای مشتقشده بازتاب مییابد.
- سازماندهی کد «Code Organization»: ارثبری سازماندهی کد را بهبود میبخشد و کلاسهای مرتبط را در یک ساختار سلسلهمراتبی گروهبندی میکند.
معایب ارث بری در سی شارپ
- اتصال تنگاتنگ «Tight Coupling»: ارثبری ارتباط تنگاتنگی بین کلاس پایه و کلاس مشتقشده ایجاد میکند که ممکن است نگهداری کد را دشوارتر کند.
- پیچیدگی «Complexity»: ارثبری میتواند پیچیدگی کد را با معرفی سطوح اضافی از انتزاع افزایش دهد.
- شکنندگی «Fragility»: ارثبری میتواند کد را شکنندهتر کند، زیرا وابستگی بین کلاس پایه و کلاس مشتقشده میتواند مشکلاتی ایجاد کند.
نتیجهگیری
ارثبری یکی از مفاهیم بنیادین در برنامهنویسی شیءگرا است که درک صحیح و استفاده بهینه از آن میتواند تاثیر چشمگیری در کیفیت کدنویسی و مدیریت پروژهها داشته باشد. این قابلیت نه تنها امکان استفاده مجدد از کد و کاهش تکرار را فراهم میکند، بلکه باعث سازماندهی بهتر و سادهتر شدن نگهداری کد میشود.
هرچند ارثبری مزایای متعددی دارد، اما در صورت استفاده نادرست، ممکن است پیچیدگی و وابستگیهای غیرضروری در کد ایجاد کند. از این رو، درک محدودیتها و چالشهای آن مانند ایجاد اتصال تنگاتنگ بین کلاسها و افزایش پیچیدگی، برای طراحی معماری بهینه و قابل اطمینان ضروری است.
در نهایت، سیشارپ با ارائه ابزارهایی مانند اینترفیسها، امکان پیادهسازی انعطافپذیرتر ارثبری را فراهم کرده است و به توسعهدهندگان اجازه میدهد از مزایای این تکنیک بهرهمند شوند، در حالی که از چالشهای رایج آن اجتناب کنند. استفاده هوشمندانه از ارثبری میتواند کدی تمیزتر، ساختاریافتهتر و کارآمدتر ایجاد کند.