מימוש של כמה ממשקים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 36 מתוך 87.
בניגוד לירושה ממחלקה, שבה אפשר להרחיב רק מחלקה אחת, Java מאפשרת למחלקה לממש ממשקים מרובים. כך Java משיגה צורה של ירושה מרובה באופן בטוח.
כדי לממש כמה ממשקים, יש לרשום אותם אחרי מילת המפתח implements, כשהם מופרדים בפסיקים:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}המחלקה חייבת לממש את כל המתודות מכל ממשק שהיא מצהירה עליו. אפשר גם לשלב ירושה עם כמה ממשקים:
public class Square extends Shape implements Drawable, Resizable {
// חובה לממש מתודות משני הממשקים
// אפשר גם להשתמש בחברים שעברו בירושה מ-Shape
}הגמישות הזאת מאפשרת לך לתכנן מחלקות שממלאות כמה תפקידים. SmartPhone יכולה לממש את הממשקים Callable, Messageable ו-Browsable, שכל אחד מהם מגדיר יכולות שונות שהטלפון תומך בהן.
אתגר
קלבואו נבנה מערכת של מכשירים חכמים שבה למכשירים יכולות מרובות. תיצרו SmartTV שאפשר גם להדליק ולכבות וגם לשלוט בעוצמת הקול שלו: כך נדגים איך מחלקה אחת יכולה לממש כמה ממשקים כדי למלא תפקידים שונים.
תארגנו את הקוד שלכם בארבעה קבצים:
Powerable.java: הגדירו ממשק למכשירים שאפשר להפעיל. עליו להצהיר על שתי מתודות:powerOn()ו-powerOff(), ושתיהן יחזירו void.VolumeControl.java: הגדירו ממשק למכשירים עם בקרת עוצמת קול. עליו להצהיר על מתודהsetVolume(int level)שמחזירה void, ועל מתודהgetVolume()שמחזירה int.SmartTV.java: צרו מחלקה שמממשת גם את הממשקPowerableוגם את הממשקVolumeControl. ל-SmartTV שלכם צריכים להיות שדהbrand(String), שדהisOn(boolean, בתחילה false), ושדהvolume(int, בתחילה 0). הוסיפו בנאי שמקבל את שם המותג. ממשו את כל המתודות הנדרשות:powerOn()צריך להגדיר אתisOnלערך true ולהדפיס:[brand] TV is now ONpowerOff()צריך להגדיר אתisOnלערך false ולהדפיס:[brand] TV is now OFFsetVolume(int level)צריכה לעדכן את עוצמת הקול ולהדפיס:[brand] TV volume set to [level]getVolume()צריכה להחזיר את עוצמת הקול הנוכחית
Main.java: חברו הכול יחד כדי להדגים מימוש של כמה ממשקים. תקבלו שני קלטים: שם מותג (String) ורמת עוצמת קול (int). צרו SmartTV עם המותג הנתון, ואז:- קראו ל-
powerOn() - קראו ל-
setVolume()עם הרמה הנתונה - הדפיסו:
Current volume: [volume]באמצעותgetVolume() - קראו ל-
powerOff()
- קראו ל-
תקבלו שני קלטים: מותג הטלוויזיה (String) ורמת עוצמת הקול (int).
הפלט שלכם צריך להציג ארבע שורות שמדגימות איך ה-SmartTV שלכם ממלא את החוזים של שני הממשקים. אפשר להפעיל אותו כמו כל מכשיר Powerable ולשלוט בעוצמת הקול שלו כמו בכל מכשיר VolumeControl!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קראו את נתוני הקלט
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: צרו SmartTV עם המותג הנתון
// TODO: קראו ל־powerOn()
// TODO: קראו ל־setVolume() עם העוצמה הנתונה
// TODO: הדפיסו: Current volume: [volume] באמצעות getVolume()
// TODO: קראו ל־powerOff()
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין