همانطور که در مقدمه مبحث برنامه نویسی شئ گرا خدمت دوستان توضیح دادم، وراثت به معنی به ارث بردن یکسری خصوصیات و رفتار بوسیله فرزند از والد است. در برنامه نویسی شئ گرا، زمانی که صحبت از وراثت می کنیم، در حقیقت می خواهیم برای یک کلاسی، یک کلاس والد مشخص کنیم. وراثت در برنامه نویسی شئ گرا کاربردهای بسیاری دارد، به صورتی که اصلی ترین و بنیادی ترین قابلیت در برنامه نویسی شئ گرا نام برده می شود. قبل از شروع به نکته زیر توجه کنید:
زمانی که کلاس A به عنوان والد کلاس B معرفی می شود، یعنی کلاس B فرزند کلاس A می باشد، می گوییم کلاس B از کلاس A مشتق شده است. در طول این دوره از واژه مشتق شده به تکرار استفاده خواهیم کرد.
در ابتدا با شیوه کلی استفاده از وراثت در کلاس ها آشنا می شویم. فرض کنید کلاسی داریم با نام A:
public class A
{
}
حال تصمیم داریم کلاسی تعریف کنیم با نام B که از کلاس A مشتق شده است، یعنی تمامی خصوصیات و رفتارهای کلاس A را به ارث می برد. برای اینکار کلاس B را به صورت زیر تعریف می کنیم:
public class B : A
{
}
بوسیله دستور بالا، کلاس A به عنوان کلاس والد کلاس B در نظر گرفته خواهد شد. گفتیم یکی از مزایای استفاده از وراثت در برنامه نویسی شئ گرا، استفاده مجدد از کدهایی است که در کلاس والد تعریف شده است. در مثال بالا، کد کلاس A خصوصیتی با نام Item1 و Item2 تعریف می کنیم:
public class A
{
public string Item1 { get; set; }
public string Item2 { get; set; }
}
به دلیل اینکه کلاس B از کلاس A مشتق شده است، می توانیم از خصوصیت های Item1 و Item2 برای کلاس B استفاده کنیم:
B obj = new B();
obj.Item1 = "Hossein Ahmadi";
obj.Item2 = "ITPro.ir";
حال، کلاس سومی تعریف می کنیم با نام C. این کلاس نیز از کلاس A مشتق می شود:
public class C : A
{
}
زمانی که شئ ای از کلاس C بسازیم، میبینیم که خصوصیات Item1 و Item2 برای این شئ کلاس C نیز وجود دارند، در حقیقت ما این خصوصیات را تنها یکبار در کلاس A تعریف کردیم و با قابلیت وراثت از این کدها برای کلاس های B و C مجدداً استفاده کردیم. زمانی که کلاسی یک یک کلاس والد مشتق می شود، علاوه بر اینکه دارای خصوصیات و رفتارهای کلاس های والد می باشد، می توان برای کلاس فرزند خصوصیات و رفتارهای جدید تعریف کرد. کلاس C را که در بالا تعریف کردیم به صورت زیر تغییر می دهیم:
public class C : A
{
public string Item3 { get; set; }
}
حال زمانی که ما شئ ای از روی کلاس C بسازیم علاوه بر خصوصیت های Item1 و Item2 که در کلاس A تعریف شده اند، به خصوصیت دیگری نیز نام Item3 که در کلاس C تعریف شده دسترسی خواهیم داشت:
var instanceOfC = new C();
instanceOfC.Item1 = "Hossein Ahmadi";
instanceOfC.Item2 = "ITPro.ir";
instanceOfC.Item3 = "C# Course";
وراثت در زبان سی شارپ، به صورت درختی می باشد، یعنی زمانی که کلاس C از کلاس A مشتق شد می توان کلاس D را نوشت که از کلاس C مشتق شده است:
public class D : C
{
public string Item4 { get; set; }
}
در مثال بالا، کلاس D علاوه بر خصوصیات کلاس A و کلاس C خصوصیات مربوط به خودش را نیز شامل می شود. در حقیقت زنجیره وراثت را در این مثال مشاهده می کنید. در مثال های بالا، کلاس ها تنها شامل Property بودند، زمانی که شما برای کلاسی یک رفتار تعریف می کنید، کلاس های فرزند آن رفتار را نیز به ارث می برند:
public class A
{
public string Item1 { get; set; }
public string Item2 { get; set; }
public void PrintItem1()
{
Console.WriteLine(Item1);
}
}
حال شئ ای از کلاس D می سازیم و رفتار PrintItem1 را صدا می زنیم:
var obj = new D();
d.PrintItem1();
در قسمت های قبلی دیدیم که کلاس D از کلاس C مشتق شده است و خود کلاس C از کلاس A. پس کلیه خصوصیات و رفتارهای کلاس A برای سطوح پایین تر وراثت قابل دسترس هستند.
کلمه کلیدی base
در قسمت های قبلی، در مورد کلمه کلیدی this توضیح دادیم و گفتیم که این کلمه کلیدی به شئ ای اشاره می کند که از روی کلاس ساخته شده. کلمه کلیدی دیگری وجود دارد با نام base که اشاره به کلاس والد دارد. برای مثال، کلاس B را به صوورت زیر تغییر می دهیم:
public class B : A
{
public void PrintParentItems()
{
Console.WriteLine(base.Item1 + " " + base.Item2);
}
}
در مثال بالا، کلمه کلیدی base به کلیه اعضای والد اشاره می کند. زمانی که شما از کلمه کلیدی base داخل کلاس استفاده می کنید، تنها اعضای کلاس والد به شما نمایش داده شده و اعضای کلاس فرزند به شما نمایش داده نمی شوند. در قسمت های بعدی با کاربردهای دیگر کلمه base آشنا می شویم.
برچسب:
نویسنده: هستی امینی