» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
קטעי קוד מעניינים + סיכום
דף ראשי  מתקדמים  קריאות לאחור II  קטעי קוד מעניינים + סיכום גרסה להדפסה

חלקי קוד מעניינים

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

 

interface CallBack{
  public void recess();
  public void lunch();
}//end interface CallBack

 

בשלב הבא נגדיר מחלקה שהאובייקטים שלה מחזיקים ברשימה של אובייקטים רשומים
(רישום זהו תהליך הכנסת אובייקט לרשימה) מסוג קריאה לאחור ויכולים להודיע לכל האובייקטים ברשימה כאשר דבר מה מעניין מתרחש. מחלקה זו נבדלת מזו בתוכנית הקודמת בכך שיש לה את היכולת להודיע עבור שני סוגים שונים של קריאה לאחור,
recess() או lunch().
שם מחלקה זו הוא מורה.

 

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

 

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

 

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

 

נדגים את אחת הפונקציות להלן

 

  void callRecess(){
    Vector tempList;//save a temporary copy of list here
    //Make a copy of the list.
    synchronized(this){
      tempList = (Vector)objList.clone();
    }//end synchronized block
    //Invoke the recess() method on each object on
    // the list.
    for(int cnt = 0; cnt < tempList.size(); cnt++){
      ((CallBack)tempList.elementAt(cnt)).recess();
    }//end for loop
  }//end callRecess()

 

בכך סיימנו את הדיון במחלקה בשם מורה. אחר כך ישנן שלוש הגדרות מחלקה אשר מיישמות את ממשק הקריאה לאחור: תלמיד, כלב, וחתול. הגדרת מחלקות אלו נבדלת מההגדרות בגרסה הקודמת של התוכנית בכך שהן מגדירות שתי פונקציות קריאה לאחור במקום אחת: recess() ו- lunch().

 

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

 

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

 

class Dog implements CallBack{  String name;
//store name here for later ID
  //-----------------------------------------------------//
    Dog(String name){//constructor
    this.name = name; //save the name to identify the obj
  }//end constructor 
//-----------------------------------------------------//
  public void recess(){
    //ignore this callback with an empty method
  }//end recess()
  //-----------------------------------------------------//
  public void lunch(){//announce lunch
    System.out.println(name + " lunch");
  }//end overridden lunch()
}//end class Dog

 

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

 

הקוד בפונקצית main() של מחלקת הבקרה מאתחל אובייקט מורה בשם missJones, ואז מאתחל מספר אובייקטים משלושה סוגים: תלמיד, כלב, וחתול. אובייקטים אלה נרשמים עבור קריאה לאחור על ידי קריאה לפונקציה register() שבאובייקט המורה.

 

לאחר מכן הקוד מעורר את הקריאה לאחור recess() והקריאה לאחור lunch().

 

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

 

class Callback03{
  public static void main(String[] args){
    //Instantiate Teacher object
    Teacher missJones = new Teacher();
    //Instantiate some Student objects
    //... code deleted
    //Instantiate some Dog objects.
    //... code deleted
    //Instantiate some Cat objects
    //... code deleted
    //Register some Student, Dog, and Cat objects with
   // the Teacher object.
    missJones.register(tom);
    missJones.register(spot);
    missJones.register(sue);
    missJones.register(cleo);
    missJones.register(fido);
    missJones.register(peg);
   missJones.register(kitty);
    missJones.register(bob);
    missJones.register(brownie);
   //Cause the Teacher object to call recess and lunch
   // on all the objects on the list.
    missJones.callRecess();
    missJones.callLunch();
  }//end main()
}//end class Callback03

 

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

 

Tom recess
Sue recess
CleoCat recess
Peg recess
ittyKat recess
Bob recess
Tom lunch
SpotDog lunch
Sue lunch
FidoDog lunch
Peg lunch
Bob lunch
BrownieDog lunch

 

 

 

 

 

 

סיכום

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

 

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

 

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

 

 06-12-03 / 17:28  עודכן ,  06-12-03 / 17:07  נוצר ע"י רונית רייכמן  בתאריך 
 קריאות לאחור II - הקודםהבא - רישום תוכנית 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 5