מחלקת הבסיס 'object'
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 23 מתוך 70.
ב־C#, כל מחלקה שאתה יוצר יורשת אוטומטית ממחלקה מיוחדת שנקראת object. גם כשאינך מציין במפורש מחלקת בסיס, object עדיין נמצא בראש שרשרת ההורשה של המחלקה שלך. פירוש הדבר הוא שלכל טיפוס ב־C# יש קבוצת מתודות משותפת.
המחלקה object מספקת כמה מתודות וירטואליות שאפשר לדרוס במחלקות שלך:
public class Person
{
public string Name { get; set; }
// דריסה של המתודה מ-object
public override string ToString()
{
return $"Person: {Name}";
}
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}שלוש המתודות הנפוצות ביותר לדריסה הן ToString() לייצוג כמחרוזת, Equals() להשוואת אובייקטים, ו־GetHashCode() לאוספים מבוססי גיבוב. כברירת מחדל, ToString() מחזירה את שם הטיפוס, ו־Equals() בודקת שוויון לפי הפניה.
מכיוון שהכול יורש מ־object, אפשר לאחסן כל סוג במשתנה מסוג object:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: Aliceמחלקת הבסיס האוניברסלית הזו היא שמאפשרת תכונות כמו אוספים שמכילים טיפוסים מעורבים, וזו הסיבה שלכל אובייקט ב-C# יש גישה למתודות כמו ToString() ו-GetType().
אתגר
קלבואו נבנה מערכת להשוואת ספרים שמדגימה כיצד דריסת מתודות ממחלקת הבסיס object מעניקה לטיפוסים מותאמים אישית התנהגות משמעותית לייצוג כמחרוזת ולבדיקת שוויון.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
Book.cs: הגדירו מחלקה בשםBookבמרחב השמותLibrary. לספר שלכם יהיו מאפייניםTitle(מחרוזת) ו-Author(מחרוזת), וכן בנאי שמגדיר את שני הערכים. דרסו את שלוש המתודות המרכזיות שעוברות בירושה מ-object:ToString()צריכה להחזיר את"{Title} by {Author}"Equals(object obj)צריכה להחזירtrueאם האובייקט השני הואBookעם אותםTitleו-AuthorGetHashCode()צריכה לשלב את קודי הגיבוב של שני המאפיינים
Program.cs: בקובץ הראשי, צרו שני ספרים באמצעות ערכי הקלט. הציגו כל ספר באמצעותToString(), ואז בדקו אם הם שווים והדפיסו את התוצאה. לבסוף, הדגימו שאפשר לאחסןBookבמשתנה מסוגobjectועדיין לקבל פלט משמעותי כשקוראים ל-ToString().
תקבלו ארבעה קלטים:
- שם הספר הראשון
- מחבר הספר הראשון
- שם הספר השני
- מחבר הספר השני
הדפיסו את הפלט בפורמט הזה:
Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}לדוגמה, אם הקלטים הם 1984, George Orwell, 1984 ו-George Orwell, הפלט צריך להיות:
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George Orwellאם הקלטים הם 1984, George Orwell, Brave New World ו-Aldous Huxley, הפלט צריך להיות:
Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George Orwellשימו לב כיצד המתודות שדרסתם מעניקות לאובייקטים מסוג Book התנהגות משמעותית — הם מוצגים כמחרוזות בצורה נאה ואפשר להשוות ביניהם לפי התוכן שלהם, ולא רק לפי הפניות הזיכרון שלהם!
נסו בעצמכם
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// קרא קלט עבור שני ספרים
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO: צור שני אובייקטים מסוג Book באמצעות ערכי הקלט
// TODO: הדפס את ספר 1 באמצעות ToString()
// פורמט: "Book 1: {ToString result}"
// TODO: הדפס את ספר 2 באמצעות ToString()
// פורמט: "Book 2: {ToString result}"
// TODO: בדוק אם הספרים שווים והדפס את התוצאה
// פורמט: "Are they equal? {True/False}"
// TODO: אחסן את הספר הראשון במשתנה מסוג object והדפס אותו
// פורמט: "Stored as object: {ToString result}"
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין