0

تفاوتهاي اصلي بين كلاس و ساختمان

 
amirpetrucci0261
amirpetrucci0261
کاربر طلایی1
تاریخ عضویت : تیر 1388 
تعداد پست ها : 27726
محل سکونت : http://zoomstar.ir/

تفاوتهاي اصلي بين كلاس و ساختمان

همانطور كه بطور مختصر در بالا نيز اشاره شد، از نظر نوشتاري (syntax) ، struct و كلاس بسيار شبيه به يكديگر هستند اما داراي تفاوتهاي بسيار مهمي با يكديگر مي‌باشند.
همانطور كه قبلاً نيز اشاره شد شما نمي‌توانيد براي يك struct سازند‌ه‌اي تعريف كنيد كه بدون پارامتر باشد، يعني براي ايجاد سازنده براي يك struct حتماً بايد اين سازنده داراي پارامتر باشد. به قطعه كد زير توجه كنيد :

struct Time
{
public Time() { ... } // خطاي زمان كامپايل رخ مي‌دهد
}

مثال 10-2-1-2

پس از اجراي كد فوق كامپايلر خطايي را ايجاد خواهد كرد بدين عنوان كه سازندة struct حتماٌ بايد داراي پارامتر باشد. حال اگر بجاي struct از كلمه كليدي calss استفاده كرده بوديم اين كد خطايي را ايجاد نمي‌كرد. در حقيقت تفاوت در اين است كه در مورد struct، كامپايلر اجازة ايجاد سازندة پيش فرض جديدي را به شما نمي‌دهد ولي در مورد كلاس چنين نيست. هنگام اعلان كلاس در صورتيكه شما سازندة پيش فرضي اعلان نكرده باشيد، كامپايلر سازنده‌اي پيش فرض براي آن در نظر مي‌گيرد ولي در مورد struct تنها سازندة پيش فرضي معتبر است كه كامپايلر آنرا ايجاد نمايد نه شما !


يكي ديگر از تفاوتهاي بين كلاس و struct در آن است كه، اگر در كلاس برخي از فيلدهاي موجود در سازندة كلاس را مقداردهي نكنيد، كامپايلر مقدار پيش فرض صفر، false و يا null را براي آن فيلد در نظر خواهد گرفت ولي در struct تمامي فيلدهاي سازنده بايد بطور صريح مقداردهي شوند و درصورتيكه شما فيلدي را مقداردهي نكيد كامپايلر هيچ مقداري را براي آن در نظر نخواهدگرفت و خطاي زمان كامپايل رخ خواهد داد. بعنوان مثال در كد زير اگر Time بصورت كلاس تعريف شده بود خطايي رخ نمي‌داد ولي چون بصورت struct تعريف شده خطاي زمان كامپايل رخ خواهد داد :

struct Time
{
public Time(int hh, int mm)
{
hours = hh;
minutes = mm;
} // خطاي زمان كامپايلي بدين صورت رخ مي‌دهد : seconds not initialized

private int hours, minutes, seconds;
}

مثال 11-2-1-2

تفاوت ديگر كلاس و struct در اين است كه در كلاس مي‌توانيد در هنگام اعلان فيلدها را مقداردهي كنيد حال آنكه در struct چنين عملي باعث ايجاد خطاي زمان كامپايل خواهد شد. همانند كدهاي فوق، در كد زير اگر از كلاس بجاي struct استفاده شده بود خطا رخ نمي‌داد :

struct Time
{
⋮ private int hours = 0; // خطاي زمان كامپايل رخ مي‌دهد
private int minutes;
private int seconds;
}

مثال 12-2-1-2

آخرين تفاوت بين كلاس و struct كه ما به آن خواهيم پرداخت در مورد ارث‌بري است. كلاسها مي‌توانند از كلاس پاية خود ارث‌بري داشته باشند در حاليكه ارث‌بري در struct ها معنايي ندارد و يك struct تنها مي‌تواند از واسطها (interface) ارث‌بري داشته باشد.

استفاده از ساختمان پس از ايجاد آن

همانطور كه گفتيم، ساختمانها روشي براي ايجاد انواع جديد مقدار (Value Types) هستند. از اينرو پس از ايجاد يك ساختمان مي‌توان از آن همانند ساير انواع مقداري استفاده نمود. براي استفاده از يك ساختمان ايجاد شده كافيست تا نام آنرا قبل از متغير مورد نظر قرار دهيم تا متغير مورد نظر از نوع آن ساختمان خاص تعريف شود.

struct Time
{
⋮ private int hours, minutes, seconds;
}
class Example
{
public void Method(Time parameter)
{
Time localVariable;
⋮ }
private Time field;
}

چهارشنبه 10 آذر 1389  10:13 PM
تشکرات از این پست
دسترسی سریع به انجمن ها