Menu
Coddy logo textTech

מחלקות גנריות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 54 מתוך 87.

עכשיו, אחרי שהבנת למה גנריות שימושיות, בוא ניצור מחלקה גנרית משלך. מחלקה גנרית מצהירה על פרמטרי טיפוס אחד או יותר בתוך סוגריים זוויתיים אחרי שם המחלקה, שאפשר להשתמש בהם בכל רחבי המחלקה.

class Box<T> {
    private T content;
    
    public void set(T content) {
        this.content = content;
    }
    
    public T get() {
        return content;
    }
}

T הוא פרמטר טיפוס: מציין מקום שמוחלף בטיפוס ממשי כשיוצרים מופע. אפשר להשתמש בכל שם, אבל מקובל להשתמש באותיות גדולות בודדות: T עבור Type,‏ E עבור Element,‏ K עבור Key,‏ V עבור Value.

בעת יצירת מופע של מחלקה גנרית, מציינים את הטיפוס בפועל בתוך סוגריים זוויתיים:

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get();  // אין צורך בהמרת טיפוס

Box<Integer> intBox = new Box<>();
intBox.set(42);
Integer num = intBox.get();

שימו לב לאופרטור <> (אופרטור היהלום) בצד ימין: Java מסיקה את הטיפוס מתוך ההצהרה. אפשר גם להשתמש בכמה פרמטרים של טיפוס עבור מחלקות שצריכות לעבוד עם יותר מטיפוס אחד:

class Pair<K, V> {
    private K key;
    private V value;
    
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
    
    public K getKey() { return key; }
    public V getValue() { return value; }
}

Pair<String, Integer> pair = new Pair<>("age", 25);
challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מתנות שמדגימה את העוצמה של מחלקות גנריות. תיצרו מערכת אחסון גמישה שיכולה להכיל כל סוג של פריט מתנה, וכן רישום שמקשר בין שמות המתנות לפרטים שלהן באמצעות כמה פרמטרים של טיפוסים.

תארגנו את הקוד שלכם בשלושה קבצים:

  • GiftBox.java: צרו מחלקה גנרית שיכולה לעטוף כל סוג של מתנה. למחלקה GiftBox<T> צריכים להיות שדה פרטי item מטיפוס T ושדה פרטי wrapped (בוליאני) שמתחיל בערך false. כללו בנאי שמקבל את הפריט, מתודה getItem() שמחזירה את הפריט, מתודה wrap() שמגדירה את wrapped לערך true, ומתודה isWrapped() שמחזירה את מצב העטיפה. הוסיפו מתודה getStatus() שמחזירה [item] (wrapped) או [item] (unwrapped), בהתאם למצב העטיפה.
  • Registry.java: צרו מחלקה גנרית עם שני פרמטרים של טיפוסים, שמקשרת בין מקבל המתנה למתנה שלו. למחלקה Registry<K, V> צריכים להיות שדות פרטיים recipient מטיפוס K ו-gift מטיפוס V. כללו בנאי שמקבל את שני הערכים, מתודות אחזור getRecipient() ו-getGift(), ומתודה getEntry() שמחזירה: [recipient] -> [gift]
  • Main.java: הפיחו חיים ברישום המתנות שלכם! תקבלו שלוש קלטים: שם של מקבל מתנה (String), תיאור של המתנה (String) ושווי המתנה (מספר שלם המייצג דולרים).

    תחילה, צרו GiftBox<String> שמכיל את תיאור המתנה. עטפו אותו באמצעות המתודה wrap(), ולאחר מכן הדפיסו את הסטטוס שלו.

    לאחר מכן, צרו GiftBox<Integer> שמכיל את שווי המתנה (המייצג סכום של כרטיס מתנה). אל תעטפו אותו: הדפיסו את הסטטוס שלו כדי להציג שהוא אינו עטוף.

    לבסוף, צרו Registry<String, String> שמקשר בין שם מקבל המתנה לתיאור המתנה, והדפיסו את רשומת הרישום.

תקבלו שלוש קלטים לפי הסדר: שם מקבל המתנה, תיאור המתנה ושווי המתנה (כמספר שלם).

שימו לב כיצד אותה מחלקה GiftBox פועלת בצורה חלקה גם עם טיפוסים String וגם עם טיפוסים Integer: זה היופי שבגנריקה! ומחלקת Registry מדגימה כיצד פרמטרים מרובים של טיפוסים מאפשרים ליצור צימודים גמישים בין כל שני טיפוסים.

נסו בעצמכם

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קרא את הקלטים
        String recipientName = scanner.nextLine();
        String giftDescription = scanner.nextLine();
        int giftValue = scanner.nextInt();
        
        // TODO: צור GiftBox<String> המכילה את תיאור המתנה
        // TODO: עטוף אותה באמצעות המתודה wrap()
        // TODO: הדפס את המצב שלה באמצעות getStatus()
        
        // TODO: צור GiftBox<Integer> המכילה את ערך המתנה
        // TODO: אל תעטוף את זו - הדפס את המצב שלה (אמור להופיע כלא עטוף)
        
        // TODO: צור Registry<String, String> המשייכת את הנמען לתיאור המתנה
        // TODO: הדפס את הרשומה באמצעות getEntry()
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין