מאפיינים לכימוס
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 32 מתוך 70.
מאפיינים הם הכלי העיקרי למימוש כימוס ב-C#. במקום לחשוף שדות ישירות, עוטפים אותם במאפיינים ששולטים באופן הגישה לנתונים והשינוי שלהם.
התבנית משלבת שדה פרטי עם מאפיין ציבורי שכולל אימות או לוגיקה בפונקציות הגישה שלו:
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15; // המינימום הוא האפס המוחלט
else
celsius = value;
}
}
}כעת קוד חיצוני לא יכול להגדיר טמפרטורה בלתי אפשרית. המאפיין משמש כשומר סף, ומבטיח שהאובייקט שלך תמיד יישאר במצב תקין. זוהי אנקפסולציה בפעולה — הנתונים הפנימיים מוגנים, אך עדיין נגישים דרך ממשק מבוקר.
אפשר גם להשתמש במאפיינים כדי לחשב ערכים או להפעיל תופעות לוואי:
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}העולם החיצוני רואה שתי תכונות, אבל באופן פנימי יש רק שדה אחד. תכונות מאפשרות לך לשנות פרטי מימוש בלי לשבור קוד שמשתמש במחלקה שלך — יתרון מרכזי של כימוס נכון.
אתגר
קלבואו נבנה מערכת לניהול מלאי מוצרים שמשתמשת במאפיינים כדי להגן על שלמות הנתונים. תיצרו מחלקה שבה המחירים לעולם לא יהיו שליליים והכמויות תמיד יישארו בטווחים תקינים — כך תראו כיצד מאפיינים משמשים כשומרי סף לנתונים שלכם.
תארגנו את הקוד שלכם בשני קבצים:
Product.cs: צרו מחלקה בשםProductבמרחב השמותInventory, שתנהל מידע על מוצרים באמצעות אימות דרך מאפיינים. המוצר שלכם צריך לכלול:- שדה פרטי
price(decimal) עם מאפיין ציבוריPriceשמוודא שהמחיר לעולם לא ירד מתחת ל־0— אם מישהו ינסה להגדיר מחיר שלילי, יש לשמור במקומו את הערך0 - שדה פרטי
quantity(int) עם מאפיין ציבוריQuantityששומר על ערכים בין0ל־1000— ערכים מתחת ל־0 יהפכו ל־0, וערכים מעל 1000 יהפכו ל־1000 - מאפיין ציבורי הממומש אוטומטית בשם
Name(string) - מאפיין מחושב לקריאה בלבד בשם
TotalValueשמחזיר אתPrice * Quantity
- שדה פרטי
Program.cs: בקובץ הראשי שלכם, צרוProductבאמצעות ערכי קלט. לאחר מכן נסו לשנות את המחיר ואת הכמות באמצעות ערכי קלט נוספים שעשויים להיות לא תקינים. הדפיסו את מצב המוצר לאחר יצירתו ולאחר כל שינוי, כדי לראות כיצד המאפיינים מגינים על הנתונים.
תקבלו חמישה ערכי קלט:
- שם המוצר
- מחיר התחלתי (decimal)
- כמות התחלתית (מספר שלם)
- המחיר החדש להגדרה (decimal, עשוי להיות שלילי)
- הכמות החדשה להגדרה (מספר שלם, עשויה להיות מחוץ לטווח)
הדפיסו את הפלט בפורמט הזה:
After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}לדוגמה, אם ערכי הקלט הם Laptop, 999.99, 50, -100 ו־1500, הפלט צריך להיות:
After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0שימו לב כיצד המחיר השלילי הפך ל־0 והכמות 1500 הוגבלה ל־1000. המאפיינים שלכם מגינים על האובייקט מפני מצבים לא תקינים — כך פועלת הכמסה!
נסו בעצמכם
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// קרא את הקלטים
string name = Console.ReadLine();
decimal initialPrice = Convert.ToDecimal(Console.ReadLine());
int initialQuantity = Convert.ToInt32(Console.ReadLine());
decimal newPrice = Convert.ToDecimal(Console.ReadLine());
int newQuantity = Convert.ToInt32(Console.ReadLine());
// TODO: צור Product באמצעות הערכים ההתחלתיים
// TODO: הדפס את מצב המוצר לאחר יצירתו
Console.WriteLine("After creation:");
// תבנית ההדפסה: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: שנה את המחיר והכמות לערכים החדשים
// TODO: הדפס את מצב המוצר לאחר השינויים
Console.WriteLine("After modifications:");
// תבנית ההדפסה: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין