שדות ומתודות סטטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 12 מתוך 70.
עד כה, כל השדות והמתודות שיצרנו שייכים לאובייקטים יחידים. אבל לפעמים צריך נתונים או התנהגות ששייכים למחלקה עצמה ומשותפים לכל המופעים. כאן נכנסת לתמונה מילת המפתח static.
שדה סטטי משותף לכל האובייקטים של מחלקה. יש רק עותק אחד, בלי קשר למספר המופעים שתיצרו:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}בכל פעם שנוצר Player חדש, TotalPlayers גדל. כל השחקנים חולקים את אותו מונה.
מתודה סטטית שייכת למחלקה ואפשר לקרוא לה בלי ליצור אובייקט:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// נקראת על המחלקה, לא על מופע
int result = Calculator.Add(5, 3);שימו לב: ניגשים לחברים סטטיים באמצעות שם המחלקה, ולא באמצעות הפניה לאובייקט. מתודות סטטיות אינן יכולות לגשת לשדות מופע או להשתמש ב־this, מכיוון שהן אינן שייכות לאובייקט מסוים.
כבר השתמשת בחברים סטטיים בלי לשים לב. Console.WriteLine() היא מתודה סטטית, ו-Math.PI הוא שדה סטטי.
אתגר
קלבואו נבנה מערכת למעקב אחר הזמנות, שמשתמשת בחברים סטטיים כדי לעקוב אחר כל ההזמנות שבוצעו באפליקציה שלכם.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
Order.cs: הגדירו מחלקתOrderבמרחב השמותOrderSystem. לכל הזמנה צריכה להיות תכונת מופעOrderId(int) ו-CustomerName(string). המחלקה צריכה גם לעקוב אחר המספר הכולל של ההזמנות שנוצרו באמצעות השדה הסטטיTotalOrders, ולספק את המתודה הסטטיתGetNextOrderId(), שמחזירה את מזהה ההזמנה הזמין הבא (החל מ-1). הבנאי צריך לקבל שם לקוח, להקצות אוטומטית את מזהה ההזמנה באמצעות המתודה הסטטית, ולהגדיל את מספר ההזמנות הכולל.Program.cs: בקובץ הראשי שלכם, צרו הזמנות על סמך קלט והציגו את הפרטים שלהן לצד מספר ההזמנות הכולל.
תקבלו שני קלטים שמייצגים שמות לקוחות עבור שתי הזמנות נפרדות.
עבור כל הזמנה, הדפיסו את הפרטים שלה בפורמט הבא:
Order #{OrderId} - Customer: {CustomerName}לאחר יצירת שתי ההזמנות, הדפיסו את המספר הכולל:
Total Orders: {TotalOrders}לדוגמה, אם הקלטים הם Alice ו-Bob, הפלט צריך להיות:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2נסו בעצמכם
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// קראו את שמות הלקוחות
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: צרו שני אובייקטים מסוג Order עם שמות הלקוחות
// TODO: הדפיסו את פרטי כל הזמנה בפורמט:
// Order #{OrderId} - לקוח: {CustomerName}
// TODO: הדפיסו את המספר הכולל של ההזמנות בפורמט:
// Total Orders: {TotalOrders}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין