تفاوتهاي اصلي بين كلاس و ساختمان
چهارشنبه 10 آذر 1389 10:13 PM
همانطور كه بطور مختصر در بالا نيز اشاره شد، از نظر نوشتاري (syntax) ، struct و كلاس بسيار شبيه به يكديگر هستند اما داراي تفاوتهاي بسيار مهمي با يكديگر ميباشند.
همانطور كه قبلاً نيز اشاره شد شما نميتوانيد براي يك struct سازندهاي تعريف كنيد كه بدون پارامتر باشد، يعني براي ايجاد سازنده براي يك struct حتماً بايد اين سازنده داراي پارامتر باشد. به قطعه كد زير توجه كنيد :
struct Time
{
public Time() { ... } // خطاي زمان كامپايل رخ ميدهد
}
پس از اجراي كد فوق كامپايلر خطايي را ايجاد خواهد كرد بدين عنوان كه سازندة 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;
}
تفاوت ديگر كلاس و struct در اين است كه در كلاس ميتوانيد در هنگام اعلان فيلدها را مقداردهي كنيد حال آنكه در struct چنين عملي باعث ايجاد خطاي زمان كامپايل خواهد شد. همانند كدهاي فوق، در كد زير اگر از كلاس بجاي struct استفاده شده بود خطا رخ نميداد :
struct Time
{
⋮ private int hours = 0; // خطاي زمان كامپايل رخ ميدهد
private int minutes;
private int seconds;
}
آخرين تفاوت بين كلاس و 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;
}