یک «ویژگی» در C# عضوی از یک کلاس است که دسترسی به دادههای داخل آن کلاس را فراهم میکند. کدهای فراخوانیکننده میتوانند داده را تنظیم یا بازیابی (خواندن) کنند. ویژگیها میتوانند خودکارپیادهسازیشده باشند یا یک «فیلد پشتیبان» داشته باشند. ویژگیها شامل یک «دسترسگر» set و/یا یک دسترسگر get هستند. در برخی زبانهای دیگر، یک «تغییردهنده» تقریباً معادل یک دسترسگر set است و یک «دسترسگر» تقریباً معادل یک دسترسگر get، هرچند ساختار نحوهی نگارش کاملاً متفاوت است.
هنگام تنظیم یک ویژگی، میتوان مقدار ورودی را اعتبارسنجی کرد، قالببندی کرد یا به شکل دیگری دستکاری کرد. در واقع، هر عملیات برنامهای که برای کد داخل کلاس قابل دسترسی باشد، میتواند اجرا شود.
به همین ترتیب، هنگام بازیابی یک ویژگی میتوان داده را محاسبه یا قالببندی کرد و باز هم هر عملیات برنامهای که در دسترس کلاس باشد، میتواند اجرا شود.
ویژگیها مانند سایر اعضای کلاس «اصلاحکنندههای دسترسی» (public، private و غیره) دارند، اما دسترسگر set میتواند سطح دسترسیای مستقل از دسترسگر get داشته باشد و برعکس. یک ویژگی لازم نیست هر دو دسترسگر را داشته باشد؛ میتواند فقط یکی را داشته باشد (یا get یا set).
نحوهی نگارش پایه برای بیان ویژگیها دو شکل دارد:
private int myField;
public int MyProperty
{
get { return myField; }
set { myField = value; }
}
public int MyProperty { get; private set; } = 42;
مقداردهی اولیه اختیاری است.
در این تمرین، یک ترازو را با کیلوگرم به عنوان یکا مدلسازی میکنید.
شما ۶ وظیفه دارید که هر کدام مستلزم پیادهسازی یک یا چند ویژگی است:
برای پاسخ به نیازهای مختلف، اجازه میدهیم هر ترازو با یک دقت سفارشیسازی شود (تعداد ارقام بعد از جداکنندهی اعشار).
کلاس WeighingMachine را طوری پیادهسازی کنید که یک ویژگی Precision فقطخواندنی داشته باشد که با آرگومان precision سازنده مقداردهی میشود:
var wm = new WeighingMachine(precision: 3);
// => wm.Precision == 3
ویژگی WeighingMachine.Weight را طوری پیادهسازی کنید که وزن هم قابل خواندن و هم قابل تنظیم باشد:
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.5;
// => wm.Weight == 60.5
واضح است که وزن کسی نمیتواند منفی باشد.
به ویژگی WeighingMachine.Weight اعتبارسنجی اضافه کنید تا هنگام تلاش برای تنظیم آن روی یک وزن منفی، ArgumentOutOfRangeException پرتاب شود:
var wm = new WeighingMachine(precision: 3);
wm.Weight = -10; // Throws an ArgumentOutOfRangeException
تنظیم تار میتواند هر مقداری باشد (حتی منفی، یا مقداری که وزن نمایشدادهشده را منفی کند).
ویژگی WeighingMachine.TareAdjustment را پیادهسازی کنید تا تنظیم تار قابل تنظیم باشد:
var wm = new WeighingMachine(precision: 3);
wm.TareAdjustment = -10.6;
// => wm.TareAdjustment == -10.6
پس از آزمایشهای کامل، مشخص شد که به دلیل یک مشکل در تولید، همهی ترازوها تمایل دارند وزن را به اندازهی 5 بیش از واقع تخمین بزنند.
ویژگی WeighingMachine.TareAdjustment را طوری تغییر دهید که مقدار پیشفرضش 5 باشد.
var wm = new WeighingMachine(precision: 3);
// => wm.TareAdjustment == 5.0
ویژگی WeighingMachine.DisplayWeight را پیادهسازی کنید که باید رشتهای برگرداند که وزن را پس از اعمال تنظیم تار، با دقت درست و همراه با یکا نشان دهد.
توجه کنید که:
display-weight = input-weight - tare-adjustment
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.567;
wm.TareAdjustment = 10;
// => wm.DisplayWeight == "50.567 kg"