فصل ششم وراثت و چند ریختی در #C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

- فصل ششم

C# وراثت و چند ریختی در  

Mohsen_mahyar@yahoo.com

آنچه که در این فصل یاد خواهید گرفت:

مفاهیم ارثبری همچون تخصص و تعمیم

تشخیص و ایجاد سلسله مراتب ارثبری

دسترسی به سازندههای کلاس پایه

چندریختی و نحوه پیادهسازی آن

کردن متدها override • ایجاد نسخههای مختلف از یک متد به کمک

آشنایی با کلاسهای انتزاعی و مهر شده و پیادهسازی این کلاسها

در فصلهای قبلی نحوهی تعریف یک کلاس جدید و ارتباط ما بین کلاسها, انجمن, تخصص1 و تجمع را بررسی کردیم. این

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

تخصصی بصورت کلاسهای کلی پایه نیز شرح داده میشود که پروسهی چندریختی 2 نام دارد.

-1-6 تخصص و تعمیم 3

کلاسها و نمونههای آنها در خلاء وجود ندارند، بلکه در یک دنیا از رابطهها و دستهها زندگی میکنند. تخصص, یکی از

تشریح می شود. زمانی که میگوییم سگ is-a مهمترین رابطه های مابین اشیاء در دنیای واقعی است که بصورت یک رابطه

یک پستاندار است، بدین معنی است که سگ نوع خاصی از پستاندار است و آن همه مشخصه 4های یک پستاندار را دارد. اما

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

از ویژگیهای سگ را به اشتراک گذارند که درعموم پستانداران وجود دارند.

1 Specialization

2 Polumorphism

3 Generalization

4 characteristic

فصل ششم- وراثت و چندریختی

107

رابطههای اختصاصی کردن و تعمیم دادن, سلسله مراتبی و دوسویه هستند. اختصاصی کردن روی دیگر سکهی تعمیم است.

پستاندار, موارد مشترک مابین سگها و گربهها را تعمیم میدهد و سگها و گربهها, پستانداران را به انواع داده خاص خود

اختصاصی میکنند.

چون این رابطه ها یک درخت رابطه ای ایجاد می کنند، پس رابطه ها سلسله مراتبی هستند که انواع داده ها ی اختصاصی

از انواع تعمیم شده انشعااب شده اند. همان طور که از سلسله مراتب به سمت بالا حرکت می کنید، تعمیم بیشتر مشاهده می

کنید. همان طورکه از سلسله مراتب به سمت پایین حرکت می کنید، آن را اختصاصی می کنید. پس گربه, پستاندار را در

داشتن چنگ ها و خرخر کردن اختصاصی می کند.

پنجره هستند، نشان میدهید که ویژگیها و رفتارهایی از پنجره وجود Listbox,Button بطور مشابه زمانیکه میگویید

را تعمیم ListBox,Button دارند که انتظار دارید دراین دو نوع داده بیایند. بعبارت دیگر, پنجره, ویژگیهای مشترک

میکند، در حالی که هر کدام ویژگیها و رفتارهای مخصوص خود را اختصاصی میکنند.

چندین علامت بصری 1 دارد که کلاسها را با کادر UML . یک زبان استاندارد برای تشریح یک سیستم شیگراست ,UML

مستطیلی نمایش میدهند. نام کلاس در بالای کادر ظاهر میگردد و متدها و اعضا در داخل کادر نمایش داده میشوند. در

1 مدل کنید. به خط جهتدار از کلاس اختصاصی شده به کلاس تعمیم شده - روابط اختصاصیکردن را بصورت شکل 6 ,UML

اشاره میکنند. Window به کلاس کلی ListBox و Button توجه کنید. در شکل زیر, کلاسهای اختصاصی شدهی

1- روابط اختصاصی کردن - شکل 6

به اشتراک گذاشتن عملکرد دو کلاس، غیرمعمول است. چون میتوانید این مشترکات را در یک کلاس پایه قرار دهید که

نسبت به کلاسهای اختصاصی شده, کلی تر است. این عمل, استفاده مجدد کد مشترک را ممکن میسازد و نگهداری کد

سادهتر میشود، چون به جای اینکه تغییرات در هر کلاس جداگانه انجام شود در کلاس منفردی رخ میدهد.

RadioButton ,CheckBox , 2) را آغاز کردید. بعد از کار با - برای مثال: فرض کنید ایجاد یک دنباله از اشیاء (شکل 6

ها میفهمید که آنها ویژگیها و رفتارهای معینی را به اشتراک میگذارند که نسبت به پنجره اختصاصیتر CommandButton

تجزیه کنید و سلسله Button هستند و ممکن است این رفتار و ویژگیهای مشترک را به یک کلاس پایه مشترک بنام

3). این مثال نحوهی استفاده از تعمیم در توسعهی شیگرایی را نشان میدهد. - مراتب وراثت را مجدداً مرتب کنید(شکل 6

1 Visual

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

108

2-ایجاد یک دنباله از اشیاء - شکل 6

3-رابطهی ما بین کلاسهای تجزیهشده - شکل 6

مشتق شده Button و ListBox 3 رابطهی مابین کلاسهای تجزیهشده را نشان میدهد و دو کلاس - شکل 6 UML دیاگرام

از RadioButton , اختصاصی میشود. در نهایت CheckBox و Command به Button را نمایش میدهد که Window از

مشتق میشود. CheckBox

این بهترین یا ضروریترین روش سازماندهی این اشیاء نیست، اما یک نقطهی شروع معقول برای فهم نحوهی ارتباط این نوع

دادهها با دیگری است.

-2-6 وراثت

رابطهی اختصاصی کردن با استفاده از یک قاعده بنام وراثت پیادهسازی میشود. این تنها راه پیادهسازی اختصاصی ,#c در

ارثبری , Window از ListBox کردن نیست، بلکه عمومیترین و طبیعیترین راه پیادهسازی این رابطه است. این گفته که

را اختصاصی میکند. window میکند, نشان میدهد که آن

ویژگیها و ListBox به عنوان یک کلاس مشتق شده اشاره میشود و ListBox یک کلاس پایه 1 بیان میشود و Window

را مشتق گرفته و نیازهای خاص خود را اختصاصی میکند. اغلب به کلاس پایه,کلاس پدر 2 گفته میشود و Window رفتار

ریشه گفته میشود. (object) کلاس مشتق شده, کلاس فرزند 3 خوانده میشود و بالاترین کلاس

1 Base class

2 Parent

3 Child

فصل ششم- وراثت و چندریختی

109

-1-2-6 پیادهسازی وراثت

یک کلاس مشتق شده را با اضافهکردن یک کالن بعد از نام کلاس که به دنبال آن نام کلاس پایه قرار میگیرد، ایجاد #c

میکند.

public class ListBox : Window

مشتق میشود. میتوان کالن را بصورت "مشتق می Window اعلان میکند که از ListBox این کد یک کلاس جدید بنام

شود از" خواند.

کلاس مشتق شده همهی اعضای کلاس پایه را به ارث میبرد و متدهای کلاس مشتق شده به همهی اعضای عمومی و حفاظت

شدهی کلاس پایه دسترسی دارند.کلاس مشتق شده در پیادهسازی نسخهی جدید خود از متد کلاس پایه آزاد است. این

انجام میشود. new عمل, پنهان کردن متد کلاس پایه نامیده میشود و از طریق علامتگذاری متد با کلمهی کلیدی

نشان میدهد که کلاس مشتق شده متدی از کلاس پایه را بطور عمدی پنهان و جایگزین کرده است. new کلمهی کلیدی

1 میبینید: - همان طور که در مثال 6

1- مثال 6

using System;

public class Window

{

// constructor takes two integers to

// fix location on the console

public Window( int top, int left )

{

this.top = top;

this.left = left;

}

// simulates drawing the window

public void DrawWindow( )

{

Console.WriteLine( "Drawing Window at {٠}, {١}",top, left );

}

// these members are private and thus invisible

// to derived class methods; we'll examine this

// later in the chapter

private int top;

private int left;

}

// ListBox derives from Window

public class ListBox : Window

{

// constructor adds a parameter

public ListBox( int top, int left, string theContents ) :

base( top, left ) // call base constructor

{

mListBoxContents = theContents;

}

// a new version (note keyword) because in the

// derived method we change the behavior

public new void DrawWindow( )

{

base.DrawWindow( ); // invoke the base method

Console.WriteLine( "Writing string to the listbox: {٠}",mListBoxContents );

}

private string mListBoxContents; // new member variable

}

public class Tester

{

public static void Main( )

#C برنامهنویسی

110

{

// create a base instance

Window w = new Window( ۵, ١٠ );

w.DrawWindow( );

// create a derived instance

ListBox lb = new ListBox( ٢٠, ٣٠, "Hello world" );

lb.DrawWindow( );

}

}

خروجی بصورت زیر است:

Drawing Window at ۵, ١٠

Drawing Window at ٢٠, ٣٠

Writing string to the listbox: Hello world

()DrawWindow شروع میشود. این کلاس یک سازنده و یک متد ساده به نام Window 1 با اعلان کلاس پایهی - مثال 6

وجود دارند. این برنامه در بخشهای بعدی بطور دقیق تحلیل میشود. left و top پیادهسازی میکند. دو فیلد خصوصی

-2-2-6 فراخوانی سازندههای کلاس پایه

مشتق میشود و سازندهی خود را دارد که سه پارامتر میگیرد. سازنده Window از ListBox 1 کلاس جدید - در مثال 6

سازندهی پدر خود را با قرار دادن کالن (:) بعد از لیست پارامترهای خود احضار میکند و سپس سازندهی کلاس ,ListBox

احضار میکند. base پایهی خود را با کلمهی کلیدی

public ListBox( int theTop, int theLeft, string theContents):

base(theTop, theLeft) // call base constructor

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

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

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

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

کلاس پایه را برای شی جاری تعیین میکند. ,base یکی از سازندههای کلاس پایهی خود را احضار کند. کلمهی کلیدی

-3-2-6 کنترل دسترسی

و private و public میتوانید میدان دید یک کلاس و اعضای آن را از طریق کاربرد معرفهای دسترسی همچون

محدود کنید. protected

کلاسها همانند اعضای خود میتوانند با هر سطح دستیابی طرٌاحی شوند. اگر یک عضوکلاس معرف دسترسی مختلفی نسبت

را بصورت زیر تعریف کنید: MyClass به خود کلاس داشته باشد, حداقل دسترسی به آن اعمال میشود. پس اگر کلاس

public class MyClass

{

// ...

protected int myValue;

}

به هر کلاس public محافظت شده است. یک کلاس myValue باشد، قابلیت دستیابی به public حتی اگر خود کلاس

ایجاد کنید که از MyOtherClass دیگر که میخواهد با آن تعامل داشته باشد نمایان است. اگر یک کلاس دیگر بنام

مشتق میشود. MyClass

public class MyClass : MyOtherClass

{

Console.WriteLine("myInt: {٠}", myInt);

}

فصل ششم- وراثت و چندریختی

111

مشتق میشود و MyClass از MyOtherClass دسترسی داشته باشد، چون myInt میتواند به MyOtherClass کلاس

دسترسی داشته باشد. myInt مشتق نشده باشد، نمیتواند به MyClass هر کلاسی که از

توجه: ایجاد متدها و خصوصیات محافظت شده نسبت به ایجاد فیلدهای محافظت شده معمولتر است.

تقریبا فیلدها همواره خصوصی هستند.

-3-6 چند ریختی

را ایجاد کردید، ListBox دو جنبهی قدرتمند برای وراثت وجود دارد: یکی قابلیت استفادهی مجدد است. زمانی که کلاس

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

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

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

ممکن است یک تلفن سنتی قدیمی یا یک تلفن الکترونیکی جدید باشد. آن فقط نوع پایه تلفن را میشناسد و انتظار دارد

هر نمونهی مشتق شده از این نوع داده نحوه زنگ خوردن خود را بداند. زمانی که شرکت مخابرات به تلفن شما سیگنال زنگ

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

-1 ایجاد انواع دادهی چندریختی -3-6

است، شما انتظار دارید در هر جایی که میخواهید پنجره Window نیز یک Button است و Window یک ListBox چون

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

شده از پنجره که تحت مدیریت خود است را نگه دارد. زمانی که پنجره باز میشود، آن میتواند از هر پنجره بخواهد که

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

اشیاء پنجره بصورت چندریختی رفتار کند.

چندریختی را در دو مرحله پیادهسازی کنید:

-1 یک کلاس پایه با متدهای مجازی ایجاد کنید.

میکنند. override -2 کلاسهای مشتق شدهای ایجاد کنید، که رفتار متدهای مجازی کلاس پایه را

علامت گذاری کنید. برای virtual برای ایجاد یک متد در کلاس پایه که چندریختی را پشتیبانی کند، آن متد را بصورت

virtual 1 چندریخت است. کلمهی کلیدی - در کلاس پنجرهی مثال 6 ()Drawwindow مثال، جهت نشان دادن اینکه متد

را بصورت زیر به اعلان آن متد اضافه کنید.

public virtual void DrawWindow( )

کلاس پایه، بوسیله پیادهسازی نسخهی جدید خود ()DrawWindow هر کلاس مشتق شده برای ارثبری و کاربرد متد

کند. نسخهی override را ()DrawWindow آزاد است. اگر یک کلاس مشتق شده متد ()DrawWindow از

کننده برای هر نمونه از کلاس مشتق شده احضار خواهد شد. متد مجازی کلاس پایه را با استفاده از کلمهی override

کننده override کنید و سپس کد تغییر یافته را به متد override در تعریف متد کلاس مشتق شده override کلیدی

کردن متدهای مجازی را نشان میدهد. override 2 نحوهی - اضافه کنید. مثال 6

2- متدهای مجازی - مثال 6

using System;

public class Window

{

// constructor takes two integers to

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

112

// fix location on the console

/ 2 نظر / 36 بازدید
maryam

salam bar shma khoob[قهقهه]

maryam

salam bar shma khoob[قهقهه]