חלקי קוד מעניינים
תחילה נגדיר ממשק בשם קריאה לאחור אשר יצור סוג חדש ויכריז על שתי פונקציות כלליות בהן ניתן להשתמש על מנת לקרוא לאחור לכל אובייקט אשר שייך למחלקה אשר מיישמת את הממשק.
interface CallBack{ |
בשלב הבא נגדיר מחלקה שהאובייקטים שלה מחזיקים ברשימה של אובייקטים רשומים
(רישום זהו תהליך הכנסת אובייקט לרשימה) מסוג קריאה לאחור ויכולים להודיע לכל האובייקטים ברשימה כאשר דבר מה מעניין מתרחש. מחלקה זו נבדלת מזו בתוכנית הקודמת בכך שיש לה את היכולת להודיע עבור שני סוגים שונים של קריאה לאחור, recess() או lunch().
שם מחלקה זו הוא מורה.
הקוד לבניית אובייקט מורה, המוסיף אובייקטים לרשימה, ומוריד אובייקטים מן הרשימה, לא השתנה, כך שנדלג על קוד זה וניגש ישר לקוד שהוא חדש ושונה.
באופן בסיסי יש לנו כעת שתי פונקציות במקום אחת. אחת הפונקציות מכונה callRecess() והשניה מכונה callLunch(). מלבד שמותיהם, שתי שיטות אלה זהות לפונקציה היחידה callTheRoll() בגרסה הקודמת של התוכנית, כך שאין צורך בדיון רב.
הקוד בפונקציה מכינה עותק של הרשימה ואז משתמש בלולאת for יחד עם מספר פונקציות וקטור על מנת לגשת לכל פוינטר לאובייקט. אז, פונקצית הקריאה לאחור נקראת ע"י הפוינטר לאובייקט.
נדגים את אחת הפונקציות להלן
void callRecess(){ //Make a copy of the list. //Invoke the recess() method on each object on |
בכך סיימנו את הדיון במחלקה בשם מורה. אחר כך ישנן שלוש הגדרות מחלקה אשר מיישמות את ממשק הקריאה לאחור: תלמיד, כלב, וחתול. הגדרת מחלקות אלו נבדלת מההגדרות בגרסה הקודמת של התוכנית בכך שהן מגדירות שתי פונקציות קריאה לאחור במקום אחת: recess() ו- lunch().
שים לב לכך שמחלקה יכולה להתעלם מסוג מסוים של קריאה לאחור על ידי הגדרת פונקצית הקריאה לאחור כפונקציה ריקה. בנוסף זכור כי שמחלקת כלב מתעלמת מקריאה לאחור recess() בדרך זו.
עקב הדמיון בין שלושת המחלקות, אני אדגים רק אחת מהן להלן. אציג את מחלקת כלב על מנת להדגים כיצד היא מגדירה פונקציה ריקה על מנת להתעלם מקריאה לאחור recess().
class Dog implements CallBack{ String name; Dog(String name){//constructor public void recess(){ public void lunch(){//announce lunch |
כעת נפנה למחלקת הבקרה אשר מקשרת בין כל החלקים ומפעילה אותם.
מלבד העובדה שפונקצית main() מעוררת שתי קריאות לאחור במקום אחת, והקוד להסרת אובייקט מן הרשימה נמחק למטרת צמצום מקום, הקוד נשאר עקרונית אותו הדבר כמו בתוכנית הקודמת.
לכן, אני אשמיט חלק מהקוד המיותר בחלק זה ואראה בעיקר את הקוד החדש.
הקוד בפונקצית main() של מחלקת הבקרה מאתחל אובייקט מורה בשם missJones, ואז מאתחל מספר אובייקטים משלושה סוגים: תלמיד, כלב, וחתול. אובייקטים אלה נרשמים עבור קריאה לאחור על ידי קריאה לפונקציה register() שבאובייקט המורה.
לאחר מכן הקוד מעורר את הקריאה לאחור recess() והקריאה לאחור lunch().
הפלט המופק בתוכנית זו מוצג לאחר רישום חלק קוד זה.
class Callback03{ //Instantiate some Student objects //Register some Student, Dog, and Cat objects with //Cause the Teacher object to call recess and lunch |
הפלט מהרצת התוכנית מופיע להלן. שים לב שהאובייקטים ממחלקת תלמיד מגיבים לקריאה לאחור recess() בנוסף לקריאה לאחור lunch(). אולם, האובייקטים של מחלקת חתול מגיבים רק לקריאות לאחור של recess(), ואובייקטים ממחלקת כלב מגיבים רק לקריאות לאחור של lunch().
Tom recess |
סיכום
לסיכום, יש לנו אובייקטים ממחלקות שונות הרשומים על גבי רשימת קריאה לאחור משותפת בה כל אובייקט על הרשימה מקבל קריאה לאחור עבור כל סוג שונה של אירוע קריאה לאחור המקושר לרשימה.
הסוגים השונים של קריאה לאחור מבוססים על ידי הכרזת פונקציות בממשק הקריאה לאחור.
כל סוג של אובייקט הרשום עבור קריאות לאחור יכול להגיב לכל הסוגים השונים של קריאות לאחור על ידי מתן הגדרות מלאות לכל פונקציות הקריאה לאחור, או יכול להתעלם סלקטיבית מסוגים מסוימים של קריאות לאחור על ידי הגדרת פונקציות קריאה לאחור אלו כריקות.