מימוש ממשקים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 35 מתוך 87.
כדי להשתמש בממשק, מחלקה חייבת לממש אותו באמצעות מילת המפתח implements. לאחר מכן המחלקה מספקת מימושים קונקרטיים לכל המתודות שהוצהרו בממשק:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}אם מחלקה מממשת ממשק אך אינה מספקת מימושים לכל המתודות שלו, המהדר יציג שגיאה. ההערה @Override היא אופציונלית, אך מומלצת כי היא עוזרת לזהות טעויות.
בדומה למחלקות מופשטות, אפשר להשתמש בממשק כסוג ייחוס. כך מתאפשר פולימורפיזם שבו אפשר להתייחס באופן אחיד למחלקות שונות שמממשות את אותו ממשק:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // מציירים עיגול ברדיוס 5.0
shape2.draw(); // מציירים מלבן בגודל 4.0 x 3.0זה עוצמתי, כי קוד שעובד עם הפניות אל Drawable לא צריך לדעת מהו סוג המחלקה הספציפי. כל מה שחשוב לו הוא שאפשר לצייר את האובייקט.
בשיעור הבא תראו איך מחלקה אחת יכולה לממש כמה ממשקים בו־זמנית.
אתגר
קלבואו נבנה מערכת רמקולים שמדגימה כיצד מחלקות מממשות ממשקים. תיצרו ממשק שמגדיר מה כל רמקול יכול לעשות, ואז תבנו שני סוגי רמקולים שונים, שכל אחד מהם מממש את החוזה הזה בדרך משלו.
תארגנו את הקוד שלכם בארבעה קבצים:
Speaker.java: הגדירו ממשק בשםSpeakerשמצהיר מה כל רמקול חייב להיות מסוגל לעשות. לכל רמקול צריכה להיות מתודתspeak()שמחזירה String. זהו החוזה שכל המחלקות המממשות את הממשק חייבות לקיים.Human.java: צרו מחלקה שמממשת את הממשקSpeaker. למחלקת Human יש שדהname(String). הוסיפו בנאי לאתחול השם, וממשו את המתודהspeak()כך שתחזיר:[name] says: Hello everyone!Robot.java: צרו מחלקה נוספת שמממשת את הממשקSpeaker. למחלקת Robot יש שדהmodel(String). הוסיפו בנאי לאתחול הדגם, וממשו את המתודהspeak()כך שתחזיר:Robot [model] says: Beep boop!Main.java: חברו את כל החלקים יחד באמצעות פולימורפיזם המבוסס על ממשקים. תקבלו שתי קלטים: שם של אדם ודגם של רובוט. צרו Human ו-Robot, ואז אחסנו אותם במערך של הפניות מסוגSpeaker. עברו בלולאה על המערך והדפיסו את התוצאה של קריאה ל-speak()עבור כל רמקול.
תקבלו שני קלטים: שם האדם (String) ודגם הרובוט (String).
הפלט שלכם צריך להציג שתי שורות: אחת לכל רמקול. שימו לב שאפשר להתייחס גם ל-Human וגם ל-Robot באופן אחיד באמצעות הממשק Speaker, אף על פי שהם מדברים בדרכים שונות לחלוטין!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קראו את הקלטים
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: צרו אובייקט Human עם השם הנתון
// TODO: צרו אובייקט Robot עם הדגם הנתון
// TODO: צרו מערך של הפניות מסוג Speaker המכיל את שני האובייקטים
// TODO: עברו על המערך והדפיסו את התוצאה של speak() עבור כל דובר
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין