סיכום – מכל גנרי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 58 מתוך 87.
אתגר
קלבואו נבנה מערכת אחסון רב־תכליתית שמאגדת את כל מה שלמדת על טיפוסים גנריים! תיצור מחלקת Container שתוכל לאחסן, לשלוף ולעבד איברים מכל סוג, לצד שיטות עזר שמדגימות שימוש ב-wildcards.
תארגן את הקוד שלך בשלושה קבצים:
Container.java: צור מחלקה גנריתContainer<T>שמנהלת אוסף של פריטים. הקונטיינר שלך צריך להשתמש באופן פנימי ב-ArrayList<T>כדי לאחסן איברים. כלול שיטות כדיadd(T item)להוסיף איבר,get(int index)לשלוף איבר ממיקום מסוים,size()להחזיר את מספר הפריטים, ו-isEmpty()לבדוק אם אין בקונטיינר איברים. הוסף גם שיטתgetAll()שמחזירה את הרשימה הפנימית.ContainerUtils.java: צור מחלקת עזר עם שיטות גנריות סטטיות שפועלות עם הקונטיינרים שלך:printAll(Container<?> container)- משתמשת ב-wildcard לא חסום כדי להדפיס את כל האיברים בכל קונטיינר, איבר אחד בכל שורה.countItems(Container<? extends Number> container)- משתמשת ב-wildcard עם חסם עליון כדי לחשב את הסכום של כל הערכים המספריים בקונטיינר, ומחזירה את התוצאה כ-double.addDefaults(Container<? super Integer> container)- משתמשת ב-wildcard עם חסם תחתון כדי להוסיף את המספרים השלמים 1, 2 ו-3 לכל קונטיינר שיכול להכיל מספרים שלמים.<T> T getLastOrDefault(Container<T> container, T defaultValue)- שיטה גנרית שמחזירה את האיבר האחרון בקונטיינר, או את ערך ברירת המחדל אם הקונטיינר ריק.Main.java: חבר את מערכת הקונטיינרים הגנרית שלך! תקבל שלוש קלטים: מילה (String), מספר שלם ומספר עשרוני.תחילה, צור
Container<String>והוסף אליו את המילה פעמיים. הדפסString container:ואז השתמש ב-printAllכדי להציג את התוכן שלו.לאחר מכן, צור
Container<Double>והוסף אליו את המספר העשרוני. הדפס שורה ריקה, ואזNumber sum: [sum]באמצעותsumValues.לאחר מכן, צור
Container<Number>וקרא ל-addDefaultsעליו. הדפס שורה ריקה, ואזAfter adding defaults:והשתמש ב-printAllכדי להציג את התוכן.לבסוף, צור
Container<Integer>ריק והשתמש ב-getLastOrDefaultעם המספר השלם שהתקבל בקלט בתור ערך ברירת המחדל. הדפס שורה ריקה, ואזLast or default: [result].
תקבל שלוש קלטים לפי הסדר: מילה (String), מספר שלם ומספר עשרוני.
האתגר הזה משלב מחלקות גנריות, שיטות גנריות, פרמטרים של טיפוסים עם חסמים ואת כל שלושת סוגי ה-wildcard. שים לב לתפקיד השונה של כל חלק: המחלקה הגנרית מספקת אחסון בטוח מבחינת טיפוסים, wildcards עם חסמים מאפשרים קריאה וכתיבה גמישות, ושיטות גנריות מציעות פעולות לשימוש חוזר בסוגים שונים של קונטיינרים!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קראו את הקלטים
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: צרו Container<String> והוסיפו את המילה פעמיים
// הדפיסו "String container:" ואז השתמשו ב-ContainerUtils.printAll()
// TODO: צרו Container<Double> והוסיפו את הערך העשרוני
// הדפיסו שורה ריקה, ואז "Number sum: [sum]" באמצעות ContainerUtils.countItems()
// TODO: צרו Container<Number> וקראו עליו ל-ContainerUtils.addDefaults()
// הדפיסו שורה ריקה, ואז "After adding defaults:" והשתמשו ב-ContainerUtils.printAll()
// TODO: צרו Container<Integer> ריק
// השתמשו ב-ContainerUtils.getLastOrDefault() עם intValue כערך ברירת המחדל
// הדפיסו שורה ריקה, ואז "Last or default: [result]"
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומים9גנריות
מבוא לגנריותמחלקות גנריותשיטות גנריותפרמטרי טיפוס מוגבליםתווים כלליים (?, extends, super)סיכום – מכל גנריתרגלו בעצמכם: קומפיילר Java אונליין