درس هشتم – ارثبری کلاسها
در این درس درباره ارثبری در زبان برنامهنویسی C# صحبت خواهیم کرد. اهداف این درس بشرح زیر میباشند :
ü پیادهسازی کلاسهای پایه (Base Class)
ü پیادهسازی کلاسهای مشتق شده (Derived Class)
ü مقدار دهی کلاس پایه از طریق کلاس مشتق شده
ü فراخوانی اعضای کلاس پایه
ü پنهانسازی اعضای کلاس پایه
ارثبری یکی از مفاهیم اساسی و پایه شیگرایی است. با استفاده از این ویژگی امکان استفاده مجدد از کد موجود فراهم میشود. بوسیله استفاده موثر از این ویژگی کار برنامهنویسی آسانتر میگردد.
ارثبری(Inheritance)
using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}
خروجی این برنامه بصورت زیر است :
Parent Constructor.
Child Constructor.
I'm a Parent Class.
در مثال 1-8 دو کلاس وجود دارد. کلاس بالای ParentClass و کلاس پائینی ChildClass است. کاری که میخواهیم در اینجا انجام دهیم اینست که زیر کلاسی ایجاد کنیم که با استفاده از کدهای موجود در ParentClass عمل نماید.
برای این منظور ابتدا باید در اعلان ChildClass مشخص کنیم که این کلاس میخواهد از کلاس ParentClass ارثبری داشته باشد. این عمل با اعلان public class ChildClass : ParentClass روی میدهد. کلاس پایه با قرار دادن ":" بعد از نام کلاس مشتق شده معین میشود.
C# فقط از ارثبری یگانه پشتیبانی مینماید. از اینرو تنها یک کلاس پایه برای ارثبری میتوان معین نمود. البته باید اشاره کرد که ارثبری چندگانه تنها از واسطها (Interfaces) امکانپذیر است که در درسهای آینده به آنها اشاره مینماییم.
ChildClass دقیقاً توانائیهای ParentClass را دارد. از اینرو میتوان گفت ChildClass یک ParentClass است. (ChildClass IS a ParentClass) ChildClass دارای متد Print() مربوط به خود نیست و از متد کلاس ParentClass استفاده میکند. نتیجه این عمل در خط سوم خروجی دیده میشود.
کلاسهای پایه به طور خودکار، قبل از کلاسهای مشتق شده نمونهای از روی آنها ایجاد میگردد. به خروجی مثال 1-8 توجه نمایید. سازنده ParentClass قبل از سازنده ChildClass اجرا میگردد.
برقراری ارتباط کلاس مشتق شده با کلاس پایه
به مثال 2-8 که در زیر آمده است توجه نمایید.
using System;
public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}
خروجی این برنامه بشکل زیر است :
From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.
کلاسهای مشتق شده در طول ایجاد نمونه میتوانند با کلاس پایه خود ارتباط برقرار نمایند. در مثال 2-8 چگونگی انجام این عمل را در سازنده ChildClass نشان میدهد. استفاده از " : " و کلمه کلیدی base باعث فراخوانی سازنده کلاس پایه به همراه لیست پارامترهایش میشود. اولین سطر خروجی، فراخوانی سازنده کلاس پایه را بهمراه رشته "From Derived" نشان میدهد.
ممکن است حالتی رخ دهد که نیاز داشته باشید تا متد موجود در کلاس پایه را خود پیادهسازی نمایید. کلاس Child این عمل را با اعلان متد Print() مربوط به خود انجام میدهد. متد Print() مربوط به کلاس Child، متد Print() کلاس Parent را پنهان میکند. نتیجه این کار آنست که متد Print() کلاس Parent() تا زمانیکه عمل خاصی انجام ندهیم قابل فراخوانی نمیباشد.
درون متد Print() کلاس Child، صریحاً متد Print() کلاس Parent را فراخوانی کردهایم. این عمل با استفاده از کلمه کلیدی base قبل از نام متد انجام گرفته است. با استفاده از کلمه کلیدی base میتوان به هر یک از اعضای public و protected کلاس پایه دسترسی داشت. خروجی مربوط به متد Print() کلاس Child در سطرها سوم و چهارم خروجی دیده میشوند.
روش دیگر دسترسی به اعضای کلاش پایه، استفاده از Casting صریح است. این عمل در آخرین سطر از متد Main() کلاس Child رخ داده است. توجه داشته باشید که کلاس مشتق شده نوع خاصی از کلاس پایهاش میباشد. این مسئله باعث میشود تا بتوان کلاس مشتق شده را مورد عمل Casting قرار داد و آنرا نمونهای از کلاس پایهاش قرار داد. آخرین خط خروجی نشان میدهد که متد Print() کلاس Parent اجرا شده است.
به وجود کلمه کلیدی new در متد Print() کلاس Child توجه نمایید. این عمل باعث میشود تا متد Print() کلاس Child متد Print() کلاس پایهاش را پنهان نماید. درصورتیکه از کلمه کلیدی new استفاده نشود، کامپایلر پیغام اخطاری را توالید میکند تا توجه شما را به این مسئله جلب کند. توضیحات بیشتر در این زمینه مربوط به مبحث چندریختی (Polymorphism) است که در درس آینده آنرا بررسی خواهیم نمود.
خلاصه
در این درس با روش ایجاد کلاس پایه و کلاس مشتق شده از آن آشنا شدید. متدهای کلای پایه را میتوانید بصورت صریح و یا ضمنی فراخوانی کنید. همچنین متوجه شدید که کلاس مشتق شده نوع خاصی از کلاس پایه است.
جناب آقای مهندس صالحی :
از زحمات فراوان شما کمال تشکر را دارم .
خوشحال میشم شمارو در گروه خودتون ببینم .
از اینکه به گروه ما لطف دارین متشکر هستیم و امید واریم که در زمینه IT افرادی چون شما (که واقعا زحمت زیادی می کشید) موفق باشند .
منتظر نظرات شما هستیم ...