مفاهیم شیء گرایی در C#

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

شیء چیست؟

همانطور که گفتیم، با یک دید تصویری به سادگی می توانید اشیاء مختلفی را در اطراف خود بیابید. تمامی این اشیاء دارای سطوح و درجه پیچیدگی متفاوتی هستند. پیچیدگی آنها به شکل ظاهری و نوع رفتار آنها بستگی دارد.

در شیء گرایی به "شکل ظاهر" در اصطلاح، صفت یا Attribute و به عملی که شیء انجام می دهد، رفتار یا Behavior می گویند.

برای مثال یک صندلی را در نظر بگیرید. صندلی صفات مختلفی دارد ولی رفتار خاصی ندارد. مثلاً پایه های صندلی جزو صفات آن بشمار می روند. با کمی دقیق تر شدن می توان از این صفات برای توصیف صندلی استفاده کرد. بعنوان مثال تعداد پایه های صندلی می تواند عددی بین 3 تا 5 باشد. محل نشستن صندلی می تواند جمله‌ای در وصف جنس آن و مقدار مصرف ماده سازنده آن باشد. پشتی صندلی را نیز می توان بعنوان متغییری boolean در نظر گرفت چراکه برخی از صندلی ها فاقد پشتی هستند. با استفاده از این سه صفت ساده، به راحتی می توان  صندلی را توصیف نمود و با همین سه صفت میتوان گونه‌های مختلفی از صندلی را نیز توصیف کرد.

منظور از رفتار، عملی است که یک شیء انجام می دهد. از اینرو برای صندلی نمی توان به سادگی صفات آن، رفتاری را متصور شد. مثلاً می‌توانیم بگوئیم تاشو بودن صندلی یکی از رفتارهای آن می تواند باشد، چراکه عملی است که می تواند یک صندلی آنرا انجام دهد.

حال شیء دیگری مانند تلویزیون را در نظر بگیرید. صفاتی که می توان برای تلویزیون در نظر گرفت عبارتند از : صفحه نمایش، سازنده آن و ... برای تلویزیون به راحتی می توان رفتار در نظر گرفت : خاموش و روشن شدن، تغییر کانال و کم و زیاد کردن صدا. این رفتارها بر اثر درخواست یک انسان یا همان کاربر اتفاق می افتند. شیء تلویزیون را میتوان بصورت زیر نمایش داد :

بطور کلی، یک شیء را میتوان بوسیله صفات و رفتارهای آن بطور کامل توصیف نمود. یک شیء حتماً جسمی فیزیکی نیست، بلکه هر چیز قابل تصوری است که دارای صفت و رفتار است. در حقیقت میتوان گفت یک شیء شبیه به یک اسم است. اگر بتوان برای این اسم، صفت و رفتاری تعریف کرد، آن وقت تبدیل به شیء می شود.

از دید انتزاعی، زمان را نیز می توان بعنوان یک شیء در نظر گرفت. صفات زمان، ساعت، دقیقه و ثانیه هستند و گذشت زمان، رفتار آن است. در ایجاد شیء هیچ محدودیتی وجود ندارد و همه چیز به تخیل شما باز میگردد.

 در زبان C#، اشیاء بوسیله کلاسها (Class) نمایش داده می شوند. داخل کلاس، صفات بصورت فیلدها ظاهر می شوند و جهت پیاده سازی رفتارها از متدها استفاده می گردد. به مثال زیر توجه نماید :

class Time

 {

    int hours;

    int minutes;

    int seconds;

                       

    void pastime()

       {

          //some implementation

       }

 }

 

در این مثال، کلاس Time مشاهده می شود. این کلاس با کلمه کلیدی class اعلان گردیده است. همانطور که میدانید، دو کروشه باز و بسته {} نیز ابتدا و انتهای کلاس را مشخص می‌کند. فیلدها دارای نام و نوع هستند. متدها دارای نام و نوع بازگشتی می باشند و پیاده‌سازی آنها داخل بلوک مربوط به خود آنها (بین دو {}) انجام میگردد.

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

کلاسه کردن اشیاء (مقدمه ای بر ارث بری Inheritance)

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

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

class Bird

{

   string beakDescription;

   int wingSpan;

   string typeOfBird;

           

   void fly()

   {

      //some implementation

   }

}

می توان این کلاس را بعنوان کلاسی عمومی برای پرندگان در نظر گرفت که دارای فیلدی جهت تعیین نوع پرنده نیز می‌باشد. با استفاده از فیلد typeOfBird می‌توان گونه پرنده مورد نظر را معین نمود.

سلسله مراتب اشیاء (بررسی ارث بری در محیط شیءگرا)

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

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

در برنامه نویسی شیءگرا، مفهومی که اشیاء را تحت یک سلسله مراتب خاص قرار میدهد، ارث‌بری یا Inheritance نامیده می‌شود. مثلاً طبقه‌بندی حیوانات را در نظر بگیرید، شیءای که در بالاترین سطح قرار می‌گیرد، شیء Animal است. این شیء دارای ویژگیهایی بسیار کلی و عمومی است و باید چنین هم باشد، چراکه سرگروه باید همیشه ویژگیهایی را داشته باشد که در زیر شاخه ها بطور مشترک وجود دارد و هر یک از زیر شاخه‌ها به ویژگیهای سرگروه خود، ویژگیها و مشخصات خاص خود را می افزایند.

در این مثال، سرگروه Animal تنها می‌تواند دارای صفت یگانه "زیستن" باشد، چراکه همین صفت آنرا از سایر اشیاء، نظیر سنگ و در و پنجره و بطور کل اجسام، متمایز می‌نماید. رفتار این شیء نیز می تواند "تنفس کردن" و "غذا خوردن" باشد. حال برای اینکه شیءای بتواند در این سلسله مراتب وارد شود، حداقل باید دارای صفت شیء سرگروه این سلسله مراتب باشد، درغیر اینصورت نمی‌تواند در زیر شاخه آن قرار گیرد.

تفاوت Animal با سایر اشیاء که در این سلسله مراتب قرار می‌گیرند در آنست که سایر اشیاء می‌بایست صفاتی دیگر و - یا رفتارهای دیگری را نیز به صفات و رفتارهای Animal اضافه کنند. این صفات و رفتارها مسلماً جزئی‌تر و دقیق‌تر از صفات و رفتارهای سرگروه است. همین مسئله مفهومی را در پیمایش سلسله مراتب‌ها بوجود می‌آورد : در پیمایش بالا به پائین (Top-Down) سلسله مراتب‌ها به جزئیات یا گونه‌های خاص برخورد می‌کنیم، حال آنکه در پیمایش پائین با بالا (Bottom-Up) به گروهها و دسته‌های عمومی می‌رسیم.

اشیاء سطوح پائینی (که به آنها child می‌گوئیم) صفات و رفتارهای اشیاء سطح بالاتر خود را به ارث می‌برند. به این اشیاء بالاتر یا سرگروهها نیز parent می‌گوئیم. به این رابطه موجود بین child و parent در اصطلاح رابطه "هست" یا "بودن" (is-a relationship) می‌گویند. مثلاً می‌گوئیم "اردک یک پرنده است".

سادگی ارث بری از نحوه ایجاد سلسله مراتب ارث‌بری نشأط می‌گیرد. اشیاء سطوح پائینی (child) در تعریف خود اشیاء سطوح بالایی (parent) خود را مشخص می‌کنند. در این جا تنها کاری که لازم است یک child نسبت به parent خود انجام دهد افزودن صفات و رفتارهای مربوط به خود است. شکل زیر یک سلسله مراتب را نشان می‌دهد.

همانطور که در این شکل ملاحظه می‌کنید، سرگروه که همان Animal است، دارای صفت Living و رفتارهایی همچون Eat() می‌باشد. زیر شاخه این شیء کلیه صفات آنرا به ارث می‌برد، بعلاوه اینکه صفت Wing و رفتار Fly() را نیز به صفات و رفتارهای parent خود می‌ا‌فزاید. حال برای زیر شاخه‌ای که در زیر Bird قرار می‌گیرد نیز می‌توان صفات و رفتارهای خاص دیگری در نظر گرفت.

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

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

انتزاع (Abstraction)

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

از طرف دیگر شیءای وجود دارد بنام اردک که واقعاً یک اردک است و دارای کلیه صفات و رفتارهای آن می‌باشد. البته باید توجه داشت که هر اردک تنها نمونه‌ای از "اردک" است. (منظور در اینجا آنست که موجودیتی مانند یک اردک که واقعا وجود دارد، خود نمونه‌ای (instance) از کلاس اردک است. درک مطالب در اینجا شاید به اندکی تأمل و حوصله نیاز داشته باشد!)

برای شیءای مانند Animal یا Bird، نمی‌توان صفتی همچون "پاهایی پهن" و یا رفتاری مانند "را رفتن شبیه به اردک" را تعریف نمود. همچنین از اشیاء Animal و Bird تنها یک نمونه می‌تواند وجود داشته باشد که این نمونه‌ها نیز بسیار مهم هستند، چراکه این نمونه‌ها هستند که ساختار یک سلسله مراتب را تشکیل می‌دهند و صفات و رفتارهای کلی آن را معین می‌نمایند. ( البته توجه کنید که استفاده از کلمه abstract در زبان C# خود یگانه بودن و همچنین انتزاعی بودن کلاس را نشان می‌دهد.)

تعریف و توصیف صحیح این اشیاء انتزاعی، همچون Animal و Bird، در طبقه‌بندی و کارآمدی ساختار سلسله مراتبی بسیار می‌تواند موثر باشد. مثال زیر نحوه تعریف و ایجاد اشیاء انتزاعی در C# را نشان می دهد.

abstract class Animal

{

   //abstract definitions and implementations

}

 

class Bird : Animal

{

  //class implementation

}

 

در این مثال کلاس Animal بصورت abstract اعلان شده تا مشخص شود که شیءای انتزاعی است. چون شیء انتزاعی عملاً وجود ندارد، نمی‌توان نمونه‌ای جدید از روی آن ایجاد کرد و تنها یک شیء از آن وجود دارد. در کلاس دوم، Bird، نشان داده شده است که این کلاس از کلاس انتزاعی Animal ارث‌بری دارد. این عمل با استفاده از ":" در جلوی نام Bird و سپس به دنبال آن نام کلاسی که Bird از آن ارث‌بری می‌کند، یعنی همان Animal، صورت گرفته است.

اشیاء درون اشیاء (مقدمه ای بر کپسوله‌کردن یا Encapsulation)

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

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

شیء Bird را که قبلاً درباره آن صحبت کردیم، در نظر بگیرید. پرندگان دارای منقار و بال هستند. خود بال یک شیء است که دارای صفاتی نظیر پر و اندازه است. رفتار آن نیز می‌توان باز و بسته شدن در حین پرواز باشد. نکته قابل اشاره در اینجا، کلمه "داشتن" است. اعمالی وجود دارند که پرنده آنها را انجام می‌دهد و این اعمال خود جزئی از پرنده هستند.

بطور کلی، رابطه "داشتن" (has-a relationship) بین یک شیء و اعمالی که بر روی اجزای خود انجام می‌دهد، وجود دارد. بعنوان مثال می‌گوئیم "پرنده بال دارد". در اینجا چون بال شیءای متعلق به پرنده است که پرنده روی آن عملی انجام می‌دهد، مفهوم کپسوله‌کردن رخ می‌دهد، شیءای درون شیءای دیگر. مثال زیر نحوه پیاده‌سازی کپسوله‌کردن را نشان می‌دهد.

class Wing

{

  int foreWingSize;

  int backWingSize;

 

  void flap()

  {

      //implementation

  }

          

  void fold()

  {

     //implementation

  }

}

 

class Bird : Animal

{

  int beakSize;

  Wing wings;

           

  void Fly()

  {

     //implementation

  }

}

 

در این مثال، دو کلاس Bird و Wing وجود دارند. کلاس Wing فیلدها و متدهای مربوط به خود را دارد. درون کلاس Bird اعلانی از کلاس Wing با استفاده از نام wings صورت گرفته است. این عمل رابطه مالکیتی بین Bird و Wing ایجاد می‌نماید. "پرنده دارای بال است". تنها چیزی که کافیست بدانیم آنست که کلاس انتزاعی پرنده دارای بال است. توجه کنید که صفات و رفتارهای کلاس Wing بوسیله خود این کلاس کنترل می‌شوند.

اشیائی با رفتارهایی متفاوت (مقدمه ای بر چندریختی یا Polymorphism)

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

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

abstract class flyingBird : Bird

{

   //implementation

}

 

class Eagle : flyingBird

{

  //implementation

}

 

class Duck : flyingBird

{

   //implementation

}

 

class Experiment

{

   public static void Main()

     {

        flyingBird flyingBirdCage = new flyingBird[2];

        flyingBirdCage[0] = new Eagle();

        flyingBirdCage[1] = new Duck();

     }

}

 

در کد فوق، 3 کلاس جدید ایجاد شده است. اولین کلاس، flyingBird است که از کلاس Bird مشتق شده است. از آنجائیکه تمامی پرندگان پرواز نمی‌کنند، این کلاس می‌تواند تنها مخصوص آن  دسته از پرندگانی باشد که می‌توانند پرواز نمایند. کلاسهای Eagle و Duck در این کد از FlyingBird مشتق شده‌اند. آخرین کلاس نیز Experiment است که متد Main() در آن قرار گرفته است. درون متد Main()، آرایه‌ای بنام flyingBirdCage از نوع FlyingBird تعریف شده که این آرایه، مخصوص اشیایی از نوع FlyingBird است. از آنجائیکه کلاسهای Duck و Eagle از نوع FlyingBird هستند، پس می‌توان آنها را در این آرایه قرار داد. نکته مهم در اینجا نیز همین مطلب است که از این پس ما پرندگانی داریم که پرواز می‌کنند و در قفس مخصوص نگهداری می‌شوند. حال تصور کنید که این نوع قفس وجود نداشت و مجبور بودیم تا برای هر پرنده نوع خاصی از قفس را تعریف نمائیم. در این شرایط حجم کار بسیار زیاد می‌شد و به مشکل بر می‌خوردیم. اما هم اکنون می‌دانیم که قفسی داریم که شرایط کلی و عمومی برای نگهداری پرندگانی که پرواز می‌کنند را داراست. در صورتیکه برای هر پرنده بخواهید قفسی مخصوص ایجاد کنید، کدی شبیه به کد زیر مورد نیاز بود :

class Experiment

{

   public static void Main()

   {

      Eagle eagleCage = new Eagle();

      Duck duckCahge = new Duck();

   }

}

علاوه بر این تصور کنید که بخواهیم مشخصات دیگری نیز به کلاسها بیفزائیم. در این شرایط کار با کدام گزینه ساده‌تر است؟ کار با آرایه‌ای از اشیاء یکسان، یا کار با اشیایی متفاوت؟ مسلماً کار با آرایه‌ها ساده‌تر است چرا که با استفاده از تنها یک دستور foreach می‌توان کلیه عناصر یک آرایه را پیمایش کرد.

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

عمل پرواز کردن، در کلیه این پرندگان وجود دارد، ولی نحوه پرواز در هر یک از آنها مسلماً متفاوت است. این مفهوم دقیقاً با مفهوم چندریختی (Polymorphism) در شیءگرایی مطابقت دارد. Polymorphism توانایی انجام یک عمل توسط اشیاء مختلف است که به شکلهای مختلف انجام می گیرد. مثال زیر نحوه پیاده‌سازی Polymorphism در زبان C# را نشان می‌دهد.

using System;

class FlyingBird

{

   public virtual void Fly()

   {

       Console.WriteLine("This shouldn't be called");

   }

}

class Eagle : FlyingBird

{

   public override void Fly()

   {

       Console.WriteLine("Eagle Fly");

   }

}

class Duck : FlyingBird

{

   public override void Fly()

   {

       Console.WriteLine("Duck Fly");

   }

}

class Experiment

{

   public static void Main()

   {

       FlyingBird[] flyingBirdCage = new FlyingBird[2];

       flyingBirdCage[0] = new Eagle();

       flyingBirdCage[1] = new Duck();

       foreach(FlyingBird bird in flyingBirdCage)

         {

             bird.Fly();

         }

   }

}

 

خروجی این برنامه بشکل زیر است :

Eagel Fly

Duck Fly

در این مثال، کلاسهای Eagel و Duck از کلاس FlyingBird مشتق شده‌اند. هر یک از این کلاسها دارای متد Fly() هستند. تنها تفاوت این متدها در نحوه اعلان و پیاده‌سازی آنهاست. در کلاس FlyingBird، متد Fly() بصورت virtual اعلان شده است، بدین معنا که کلاسهای مشتق شده از این کلاس می‌توانند شخصاً به پیاده‌سازی این متد بپردازند. پیاده‌سازی این متد در کلاسهای مشتق شده با استفاده از کلمه کلید override صورت می‌گیرد. در متد Main() با استفاده از یک حلقه foreach، تک تک این متدها فراخوانی می‌شوند. بعلت اینکه کلیه این متدها بصورت override تعریف شده‌اند، در فراخوانی بصورت مجزا اجرا می‌شوند.

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

 


 

استفاده از مطالب این قسمت از  سایت در هر سایت یا وبلاگ و رسانه دیگری با ذکر آدرس دقیق منبع و نام نویسنده آن بلامانع می‌باشد. تمامی حقوق مادی و  معنوی این سایت و این نوشته متعلق به شخص "میثم قزوینی" است.


 منابع این مطلب :

C# Unleashed Second Edition

Author : Joseph Mayo

Publisher : SAMS Publications

Copyright © 2002 - 2003 SAMS Publications Press

 

Copyrights © 2004-2005 Meysam Ghazvini. Iran. Tehran 

  
نویسنده : ali gooliof ; ساعت ٤:٠۱ ‎ب.ظ روز ۱۳۸٧/٢/٦
تگ ها :