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

Slides:



Advertisements
Similar presentations
Object Oriented 33 MCSD DORON AMIR
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
האוניברסיטה העברית בירושלים
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
Inverse kinematics (Craig ch.4) ב"ה. Pieper’s solution נתבונן ברובוט עם 6 מפרקי סיבוב כאשר שלושת הצירים של המפרקים האחרונים נחתכים. נקודת החיתוך נתונה.
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
אינטרפולציה רועי יצחק.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
אוניברסיטת בן גוריון - מבוא למדעי המחשב 1 תרגול מספר 10  ממשקים o כללים בסיסיים o מימוש מספר ממשקים o דוגמת ממשק כחוזה  הורשה o כללים בסיסיים o דריסה.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 7 ISP דוגמא נוספת.
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
תוכנה 1 בשפת Java נושאים שונים בהורשה רובי בוים ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
תכנון השעור מבוסס על שאלה 3 במבחן המסכם ( מועד א ' ) 2010.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
תרגול 12: Iterator מחסנית תור 1. מחסנית (stack) מחסנית (stack) היא מבנה נתונים שמזכיר מחסנית של רובה : האיבר שנכנס ראשון למחסנית יוצא ממנה אחרון (LIFO.
מבוא למדעי המחשב הרצאה 18: פולימורפיזם ומחלקות אבסטרקטיות 1.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות מתקדם
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
תוכנה 1 בשפת Java תרגול מספר 9: נושאים שונים בהורשה אסף זריצקי ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב.
Java Reflection הוכן על-ידי אחמד ג'בארה
שימוש בעצם ממחלקה אחרת כמאפיין במחלקה הנוכחית
האוניברסיטה העברית בירושלים
Tirgul 12 Trees 1.
Operators Overloading
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא לתכנות מונחה עצמים Object Oriented Programming
תוכנה 1 תרגול 13 – סיכום.
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים בשפת JAVA
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
ממשקים - interfaces איך לאפשר "הורשה מרובה".
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים ושפת JAVA
הכמסה – Encapsulation עקרון ההכמסה
מערכים של מצביעים הקצאה דינאמית
ירושה הגדרת קשר Is A.
מבוא לתכנות מונחה עצמים Object Oriented Programming
תרגול 10 המשך תכנות מונחה עצמים.
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
תוכנה 1 תרגול 13 – סיכום.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

Interface ממשקים 1

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

Student public class Student { // Sate: private String name; private int id; // Constructors: public Student(int id, String name) { this.name = name; this.id = id; } // Behavior: … } // class Student 3

Car public class Car { // Sate: private String company; private int model; // Constructors: public Car(int model, String company) { this.company = company; this.model = model; } // Behavior: … } // class Car 4

נתבונן במערך של מצביעים לאוביקטים מטיפוס Students: Students[] arr = new Student[10]; על מנת למיין אותו נבחר אחד מאלגוריתמי המיון שלמדנו, למשל InsertionSort 5

insertionSort public static void insertionSort(int[] array){ for (int i=1; i<array.length; i=i+1){ int value = array[i]; int j = i; while(j>0 && (array[j-1] > value) ){ array[j] = array[j-1]; j = j-1; } array[j] = value; }//for }//insertionSort 6

מעבר למיון סטודנטים מהו הקושי העיקרי בשינוי הפונקציה כדי שתתאים למיון סטודנטים ? פעולת ההשוואה כמובן : array[j-1] > value הפעולה הראשונה שצריך לעשות היא להחליט על פעולת ההשוואה. למשל, השוואת מספר תעודת הזהות. עכשיו ניתן לכתוב : 7

מיון סטודנטים public static void insertionSort(Student[] array){ for (int i=1; i<array.length; i = i+1){ Student value = array[i]; int j = i; while(j>0 && (array[j-1].getId() > value.getId())){ array[j] = array[j-1]; j = j-1; } array[j] = value; } }//insertionSort(Student[] array) 8

עכשיו ניתן להפעיל : Students[] arr=new Student[10]; insertionSort(arr); ומה עם Car? Car[] arr=new Car[10]; insertionSort(arr);//???? 9

מיון מכוניות public static void insertionSort(Car[] array){ for (int i=1; i<array.length; i = i+1){ Car value = array[i]; int j = i; while(j>0 && (array[j-1].getModel() > value.getModel()) ){ array[j] = array[j-1]; j = j-1; } array[j] = value; } }//insertionSort(Car[] array) 10

אז מה פתרון אפשרי ? כמובן Object... public static void insertionSort(Object[] array){ for (int i=1; i<array.length; i=i+1){ Object value = array[i]; int j = i; while(j>0 && (array[j].???? > value. ????) ){ array[j] = array[j-1]; j = j-1; } array[j] = value; } }//insertionSort 11

ממשק - Interface אז כיצד נפתור זאת ? היינו רוצים להגיד שכל אובייקט שרוצה להיות בר - מיון יוכל להשתמש בפונקציית המיון הזאת. ראינו רעיון דומה עם equals ב ObjectSet... אם היתה לנו דרך להוסיף תכונת " בר - השוואה " לכל אובייקט שאנו רוצים למיין, היינו בדרך הנכונה. בדיוק למטרה זו, ב JAVA קיים המושג ממשק (interface) 12

ממשק הוא הגדרת התנהגות ללא מימוש 13

הממשק Comparable public interface Comparable { /** other an object to compare with this * Comparable object a negative value, 0, or a positive value, * if this object has a lower, an identical, or a * higher rank in the order, respectively. */ public int compareTo(Object other); } 14

הממשק Comparable בדוגמה שלנו, הגדרנו את התכונה תכונה " בר - השוואה ": public int compareTo(Object other); שימו לב כי השיטה compareTo היא חסרת מימוש. השיטה compareTo תחזיר מספר שלילי אם מקומו של האובייקט היוזם את הקריאה בסידור קודם למקום האובייקט המתקבל כפרמטר, מספר חיובי אם מקומו מאוחר, ואפס אם מקומם זהה. 15

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

מי שרוצה להיות בעל התכונה " בר - השוואה " חייב לממש את כל השיטות המופיעות בממשק. אחרת, לא יעבור קומפילציה : public class Student implements Comparable{ … public int compareTo(Object other) { int otherId = ((Student)other).getId(); return id - otherId; } } // class Student 17

פתרון " מקצועי " יותר public class Student implements Comparable{ … public int compareTo(Object other) { if (!(other instanceof Student)){ throw new RuntimeException( "CompareTo got a non-Student parameter."); } int otherId = ((Student)other).getId(); return id - otherId; } } // class Student 18

אפשרות שנייה – סידור לקסיקוגרפי לפי שם. במקרה זה ניתן להשתמש בשיטה compareTo של String: public class Student implements Comparable{ … public int compareTo(Object other) { if (!(other instanceof Student)){ throw new RuntimeException( "CompareTo got a non-Student parameter."); } String otherName = ((Student)other).getName(); return name.compareTo(otherName); } } // class Student 19

ועבור המחלקה Car: public class Car implements Comparable{ … public int compareTo(Object other){ if (!(other instanceof Car)){ throw new RuntimeException("CompareTo got a non-Car parameter."); } int otherModel = ((Car)other).getModel(); return model - otherModel; } } // class Car 20

בני השוואה עכשיו העצמים במחלקה Car וגם העצמים במחלקה Student הם בני - השוואה ( כלומר – שתי המחלקות " חתמו על החוזה " Comparable). ב JAVA ניתן להגדיר מצביעים אשר הטיפוס שלהם הוא ממשק, ובכך להתייחס לאובייקט המוצבע לפי התכונות המחייבות אותו אשר מופיעות בממשק. רעיון זה אינו מופרך – גם אנחנו מתייחסים לפעמים לתכונות ספציפיות של סטודנט או מרצה, ולפעמים לתכונות משותפות של שניהם כבני - אדם. לכן : Student s = new Student("shlomo",124); Comparable c = s; או למשל, Comparable c = new Student("shlomo",124); 21

שימו לב כי לא ניתו ליצור אובייקט מטיפוס ממשק : Comparable c = new Comparable(); הסיבה היא פשוטה – Comparable היא בסה " כ תכונה, ולא מחלקה. public static void func(Comparable c){…} Car car1 = new Car(2004, "Toyota"); Comparable car2 = new Car(1990, "Mercedes"); Point p = new Point(1,1); Object car3 = new Car(1982, "Lada"); func(car2); func(car1); func(p); func(car3); func((Comparable) car3); func((Comparable) p); Car3 = p; func((Comparable) car3); 22

Sorting both Students and Cars public static void main(String[] args) { Student[] myStudents = new Student[2]; myStudents[0] = new Student(2, "Vika"); myStudents[1] = new Student(1, "Dan"); System.out.println(arr2String(myStudents)); insertionSort(myStudents); System.out.println(arr2String(myStudents)); Car c1 = new Car(2004, "Toyota"); Car c2 = new Car(1990, "Mercedes"); Car[] myCars = {c1,c2}; System.out.println(arr2String(myCars)); insertionSort(myCars); System.out.println(arr2String(myCars)); } 23

עכשיו נחזור למיון : public static void insertionSort(Comparable[] array){ Comparable value; for (int i=1; i < array.length; i = i+1){ value = array[i]; int j = i; while(j>0 && array[j-1].compareTo(value) > 0){ array[j] = array[j-1]; j = j-1; } array[j] = value; } }//insertionSort(Comparable[] array) 24

נקודות נוספות לדיון ומחשבה : הממשק שהגדרנו קיים בחבילה (package) java.lang, וחלק מהמחלקות המובנות ב -java מממשות אותו ( למשל String). אילו שיטות ניתן להפעיל על עצם ? לפי הטיפוס של המצביע, אלא אם כן עשינו casting. ממשק יכול להגדיר יותר משיטה אחת. מחלקה יכולה לממש יותר ממשק אחד : public class Car implements Comparable, Vehicle{…} ממשקים והנדסת תוכנה – אינטגרציה, תיקון באגים, חשיבה עתידית וגמישות. 25

ראינו מימוש של InsertionSort. כמובן שבאותו האופן קיימים MergeSort, BubbleSort וכו. נניח שנרצה למיין במספר אופנים שונים בתוכנית שלנו. היכן נמקם את השיטות הללו ? במחלקה אחת ? public class sortAlgorithms{ public static void InsertionSort(Comparable[] arr); public static void MergeSort(Comparable[] arr); … } 26

Sorter public interface Sorter{ public void sort(Comparable[] array); } עכשיו, כל מי שרוצה להוסיף שיטת מיון חדשה צריך פשוט לממש את הממשק Sorter: 27

class InsertionSorter implements Sorter{ public void sort(Comparable[] array){ … } }//class class MergeSorter implements Sorter{ public void sort(Comparable[] array){ … } }//class 28

דוגמה : Sorter s1= new InsertionSorter(); Student[] sArr=new Student[2]; sArr[0]=new Student( ,"david"); sArr[1]=new Student(111252,"Anat"); s1.sort(sArr); Sorter s2= new MergeSorter(); Car[] cArr=new Car[2]; cArr[0]=new Car(2004,"toyota"); cArr[1]=new Car(1943,"Ford"); s2.sort(cArr); 29

Interface Replicable מוטיבציה xy getX() getY() xy getX() getY() xy getX() getY() מצב בלתי חוקי – שני עצמים זהים )לפי שיטת equals שלהם) בקבוצה. נובע מכך ששמרנו ב-add מצביע לאובייקט המקורי 30

public void add(Object o){ if ((o != null) && !contains(o) && (size<elements.length)){ elements[size] = o; size = size + 1; } }//add 31

Interface Replicable מוטיבציה xy getX() getY() xy getX() getY() xy getX() getY() נרצה שבקבוצה יאוכסנו רק עותקים של העצמים. שאפשר יהיה להגיע אליהם רק דרך השיטות של הקבוצה. מה הבעיה? new Object לא ייצור את האובייקט שאני באמת רוצה – בזמן ריצה 32

public void add(Object o){ if ((o != null) && !contains(o) && (size<elements.length)){ elements[size] = new Object(o); size = size + 1; } }//add 33

Replicable נגדיר ממשק Replicable, אשר כל מי שמממש אותו הוא " בר - הכפלה ". לממשק זה תהיה שיטה אחת בלבד אשר תחזיר עותק של האובייקט : public interface Replicable { /** a replicate of this object. */ public Object replicate(); } 34

נסתכל לדוגמה על המחלקה Point: public class Point implements Replicable { … public Object replicate(){ return new Point(this); } } 35

ReplicableObjectSet וכעת נגדיר מחלקה ReplicableObjectSet. מחלקה זו תהיה זהה לחלוטין למחלקה ObjectSet, אך תכלול שני הבדלים : –במקום לקבל בשיטה add פרמטר מסוג Object נקבל פרמטר מסוג Replicable. –הקבוצה תחזיק עותקים של האוביקטים שהכנסנו אליה, ולא את המקוריים. לגורמים חיצוניים לא תיהיה גישה ישירה אל אברי הקבוצה. 36

ReplicableObjectSet public class ReplicableObjectSet { … public void add(Replicable o){ if ((o != null) && !contains(o) && (size<elements.length)){ elements[size] = o.replicate(); size = size + 1; } }//add 37