מבוא למדעי המחשב משפחות של מחלקות ומחלקות מופשטות
תזכורת בשיעור הקודם ראינו מחלקה של Student והרחבה שלה למחלקה של Milgae למעשה Student יכול לעמוד בראש היררכיה שלמה של מחלקות שונות של סטודנטים למשל, בנוסף למלגאי, אפשר לחשוב על שומעים חופשיים סטודנטים בתוכניות של החלפת סטודנטים סטודנטים עם שכר לימוד מוגבל וכו'
היררכיה של מחלקות Student יתרונות הכללה מחזור קוד Milgae FreeAuditor Visitor מבנה ההיררכיה בראש ההיררכיה המחלקה הכללית ביותר כל מחלקה ספציפית יותר מזו שהיא תלויה עליה שיטות מורשות שיטות חדשות דריסה - משמעות ספציפית לשיטות שמקבלים בירושה מעשית מתחילים מלמעלה מגדירים את מה שכללי לכולם מרחיבים ומפרטים
המחלקה סטודנט public class Student extends Object { private static int COURS_PRICE = 1000; private String name; private int numofcourses; public Student(String name, int numofcourses) { this.name = name; this.numofcourses = numofcourses;
המחלקה סטודנט public String getname() { return name; public int getnumofcourses() { return numofcourses; public int tuitionfee() { return numofcourses * COURS_PRICE;
המחלקה סטודנט public boolean equals(object other) { return other instanceof Student && ((Student) other).name.equals(name); public String tostring() { return "{" + name + ", " + numofcourses + ", " + tuitionfee() + "";
המחלקה מלגאי public class Milgae extends Student { private int milga; public Milgae(String name, int numofcourses, int milga) { super(name, numofcourses); this.milga = milga; public int getmilga() { return milga; public int tuitionfee() { return Math.max(0, super.tuitionfee() - milga);
המחלקה שומע חופשי public class FreeAuditor extends Student { public FreeAuditor(String name, int numofcourses) { super(name, numofcourses); public int tuitionfee() { return 0;
המחלקה סטודנט אורח public class Visitor extends FreeAuditor { private String university; public Visitor(String name, int numofcourses, String university) { super(name, numofcourses); this.university = university; public String getuniversity() { return university;
סוג של תת-מחלקה היא סוג של מחלקת העל שלה למה?
public static void main(string[] args) { Student s1 = new Student("S1", 1); System.out.println(s1); // {S1, 1, 1000 Object s2 = new Student("S2", 2); System.out.println(s2); // {S2, 2, 2000 Milgae m1 = new Milgae("M1", 1, 100); System.out.println(m1); // {M1, 1, 900 Student m2 = new Milgae("M2", 2, 200); System.out.println(m2); // {M2, 2, 1800 Object m3 = new Milgae("M3", 3, 300); System.out.println(m3); // {M3, 3, 2700 FreeAuditor f1 = new FreeAuditor("F1", 1); System.out.println(f1); // {F1, 1, 0 Student f2 = new FreeAuditor("F2", 2); System.out.println(f2); // {F2, 2, 0 Object f3 = new FreeAuditor("F3", 3); System.out.println(f3); // {F3, 3, 0 Visitor v1 = new Visitor("V1", 1, "U1"); System.out.println(v1); // {V1, 1, 0 FreeAuditor v2 = new Visitor("V2", 2, "U2"); System.out.println(v2); // {V2, 2, 0 Student v3 = new Visitor("V3", 3, "U3"); System.out.println(v3); // {V3, 3, 0 Object v4 = new Visitor("V4", 4, "U4"); System.out.println(v4); // {V4, 4, 0
מחלקות מופשטות לפעמים המחלקה העומדת בראש ההיררכיה (אבל לא רק) עשויה להיות מחלקה שהאובייקטים שלה אינם באמת מייצגים אובייקטים ממשיים, והגדרתה משמשת רק לצורך הכללה ומחזור קוד למשל עץ מול אורן או אזדרכת מחלקות כאלה נקראות מחלקות מופשטות
היררכיה של מכלים בצורות גיאומטריות שונות Cylinder Tank Box תכונות נדרשות תכולה מקסימלית עדכון ממדים כמות נוזל עכשווית עדכון כמות Cube טבעי לממש תכולה ברמה הפרטית (הגיאומטרית) כמות נוזלים עכשווית ברמה הכללית
המחלקה המופשטת Tank public abstract class Tank { private double content; public Tank(double content) { this.content = content; public double content() { return content; public abstract double capacity(); public double fill(double amount) { double fill = Math.min(amount, capacity() - content); content = content + fill; return fill;
המחלקה חבית public class Cylinder extends Tank { private double radius; private double height; { public Cylinder(double content, double radius, double height) super(content); this.radius = radius; this.height = height; public double capacity() { return Math.PI * radius * radius * height;
המחלקה Box public class Box extends Tank { private double x, y, z; public Box(double content, double x, double y, double z) { super(content); this.x = x; this.y = y; this.z = z; public double capacity() { return x * y * z;
המחלקה Cube public class Cube extends Box { public Cube(double content, double x) { super(content, x, x, x);
שימוש public static void main(string[] args) { Tank[] array = { new Cylinder(100, 10, 10), new Box(100, 10, 20, 30), new Cube(100, 10) ; for (int i = 0; i < array.length; i = i + 1) { System.out.print( array[i].capacity() + ":" + array[i].content()) + ":"; array[i].fill(100); System.out.println( array[i].content()); 3141.5:100.0:200.0 6000.0:100.0:200.0 1000.0:100.0:200.0
דרגות של נראות
נראות מוגנת public class Student extends Object { protected static int COURS_PRICE = 1000; private String name; protected int numofcourses; public class Milgae extends Student { private int milga; public int tuitionfee() { return Math.max(0, numofcourses * COURS_PRICE - milga);
מה אפשר לדרוס? רק שיטות לא סטטיות ציבוריות, מוגנות או ברמה של החבילה עוברות בירושה וניתנות לדריסה שיטות סטטיות (מכל דרגת נראות), לא סטטיות פרטיות ושדות (מכל דרגת נראות) לא עוברים בירושה ואינם ניתנים לדריסה
Casting & instanceof (Type) x x instanceof Type עובר קומפילציה אם ורק אם Type x יש יחסים היררכיים בין העצם המיוחס ל- ו- Type העצם המיוחס ל- x הוא סוג של או x הוא סוג של העצם המיוחס ל- Type