אינדקסרים (this[])
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 37 מתוך 70.
מאפשרי אינדקס מאפשרים לך לגשת לאיברים במחלקה שלך באמצעות סימון סוגריים הדומה למערך. במקום לקרוא למתודה כמו collection.GetItem(0), אפשר לכתוב את הצורה האינטואיטיבית יותר collection[0].
מגדירים אינקסר באמצעות מילת המפתח this עם סוגריים מרובעים:
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}עכשיו אפשר לגשת למילים באופן טבעי:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#אינדקסים אינם מוגבלים למספרים שלמים. אפשר להשתמש בכל טיפוס כפרמטר אינדקס, מה שהופך אותם לשימושיים לגישה דמוית מילון:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}בדומה למאפיינים, אינדקסרים יכולים להיות לקריאה בלבד (על ידי השמטת ה־setter) או לכלול לוגיקת אימות במאפייני הגישה שלהם. הם אידיאליים כשהמחלקה שלך עוטפת אוסף או כשסימון בסוגריים מרובעים הופך את הקוד לקריא יותר.
אתגר
קלבואו נבנה מחלקה בשם Playlist שמאפשרת לגשת לשירים באמצעות סימון סוגריים מרובעים אינטואיטיבי, ממש כמו בעבודה עם מערך. תיצרו רשימת השמעה של מוזיקה שבה אפשר לקבל ולעדכן שירים לפי מיקומם באמצעות אינדקסר.
תארגנו את הקוד בשני קבצים:
Playlist.cs: צרו מחלקה בשםPlaylistבמרחב השמותMusic, שעוטפת אוסף פנימי של שירים ומספקת גישה דמוית מערך באמצעות אינדקסר. רשימת ההשמעה שלכם צריכה לכלול:- מערך מחרוזות פרטי לאחסון שמות השירים
- בנאי שמקבל מחרוזת של שמות שירים המופרדים בפסיקים ומפצל אותה למערך הפנימי
- אינדקסר המשתמש ב־
this[int index]ומאפשר גם לקבל וגם להגדיר שירים במיקום מסוים - מאפיין לקריאה בלבד
Countשמחזיר את מספר השירים ברשימת ההשמעה - מתודה
GetAllSongs()שמחזירה את כל השירים כשהם מחוברים באמצעות" | "
Program.cs: בקובץ הראשי, צרו רשימת השמעה מקלט, ואז השתמשו באינדקסר כדי לגשת לשירים ולשנות אותם. הדגימו גם קריאת שירים לפי אינדקס וגם עדכון שיר במיקום מסוים.
תקבלו שלושה קלטים:
- רשימת שמות שירים המופרדים בפסיקים (לדוגמה,
Song A,Song B,Song C) - אינדקס לשליפת שיר (מספר שלם)
- שם של שיר חדש שיחליף את השיר באותו אינדקס
הדפיסו את הפלט בפורמט הבא:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}לדוגמה, אם הקלטים הם Rock Anthem,Jazz Vibes,Pop Hit, 1 ו־Blues Classic, הפלט צריך להיות:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hitשימו לב איך האינדקסר מאפשר לגשת אל playlist[1] כדי לקבל את "Jazz Vibes" ואז להקצות playlist[1] = "Blues Classic" כדי לעדכן אותו — טבעי הרבה יותר מקריאה למתודות כמו GetSongAt(1) או SetSongAt(1, "Blues Classic")!
נסו בעצמכם
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// קראו את הקלטים
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: צרו אובייקט Playlist מתוך songList
// TODO: הדפיסו את מספר השירים הכולל באמצעות המאפיין Count
// TODO: הדפיסו את השיר במיקום הנתון באמצעות האינדקסר
// TODO: עדכנו את השיר במיקום הנתון באמצעות האינדקסר
// TODO: הדפיסו את כל השירים לאחר העדכון באמצעות GetAllSongs()
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין