מאפיינים לכימוס
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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# אונליין