תרגול 7: מנשקים, פולימורפיזם ועוד

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) אתגר מחזור ב'
1 נושאי התרגול : Copy constructor Assignment operator המרת טיפוסים אוטומטיות. תכנות גנרי - Templates.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
עיבוד תמונות ואותות במחשב אלכסנדר ברנגולץ דואר אלקטרוני : שיטות קידוד שיטות קידוד אורך מלת קוד ואנטרופיה אורך מלת קוד ואנטרופיה קידוד.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
1 נושאי התרגול : Copy constructorCopy constructor Assignment operatorAssignment operator המרת טיפוסים אוטומטיות המרת טיפוסים אוטומטיות תכנות גנרי – Templates.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 7 ISP דוגמא נוספת.
אתחול עצמים. אתחולים ובנאים יצירת מופע חדש של עצם כוללת: הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי/ם של מחלקת הבסיס.
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
תוכנה 1 בשפת Java תרגול מספר 8: הורשה אסף זריצקי ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים עוברים לג ' אווה.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 Control (Part II)
1 תרגול 11: Design Patterns ומחלקות פנימיות 1 תוכנה 1.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
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.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
תוכנה 1 תרגול 2: מערכים, לולאות והתמודדות עם שגיאות.
מחרוזות – הטיפוס String
האוניברסיטה העברית בירושלים
© Keren Kalif JDBC קרן כליף.
תרגול 7: מנשקים, פולימורפיזם ועוד
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
Object Oriented Programming
Object Oriented Programming
תכנות מכוון עצמים ו- C++ יחידה 11 תבניות - templates
Operators Overloading
Object Oriented Programming
Object Oriented Programming
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
מבוא למדעי המחשב – סמסטר א' תשע"ב
תוכנה 1 תרגול 13 – סיכום.
תוכנה 1 תרגול 13 – סיכום.
SQL בסיסי – הגדרה אינדוקטיבית
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
תכנות מכוון עצמים ושפת JAVA
עבודה עם נתונים באמצעות ADO.NET
ממשקים - interfaces איך לאפשר "הורשה מרובה".
תרגול מס' 6 מחלקות, עצמים, וקצת חוזים
תרגול 1: סביבת העבודה ומבוא ל-Java
תוכנה 1 בשפת Java שיעור מספר 8: "ירושה נכונה" (הורשה II)
ניתוח מערכות מידע תכנות ב C#
תכנות מכוון עצמים ושפת JAVA
מבוא למדעי המחשב – סמסטר א' תשע"ד
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
תוכנה 1 תרגול 13 – סיכום.
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Computer Architecture and Assembly Language
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

תרגול 7: מנשקים, פולימורפיזם ועוד תוכנה 1 תרגול 7: מנשקים, פולימורפיזם ועוד * לא בהכרח בסדר הזה

מנשקים

מנשקים - תזכורת מנשק (interface) הוא מבנה תחבירי ב-Java המאפשר לחסוך בקוד לקוח. מנשק מכיל כותרות של מתודות (חתימות). יתכן גם מימוש דיפולטיבי שלהן (החל מג'אווה 8). קוד אשר משתמש במנשק יוכל בזמן ריצה לעבוד עם מגוון מחלקות המממשות את המנשק הזה (ללא צורך בשכפול הקוד עבור כל מחלקה).

הגדרת מנשק - תזכורת שם המנשק public interface InterfaceName { public String someMethod(); public void anotherMethod(int param); } public class Concrete implements InterfaceName { … @Override public String someMethod() {…} public void anotherMethod(int param) {…}   מחלקה המממשת את המנשק

דוגמא 1: Shape - מנשק המייצג צורה getArea() – מחשבת את שטח הצורה getDetails() – מחזירה מחרוזת המייצגת את הצורה. public interface Shape { public float getArea(); public String getDetails(); {

המחלקה מצהירה שהיא מממשת את המנשק מימוש של המתודות מהמנשק המחלקה Square public class Square implements Shape { float side; public Square(float side) { this.side=side; } public float getArea() { return (side*side); public String getDetails() { return "Square: side=" + this.side; { המחלקה מצהירה שהיא מממשת את המנשק מימוש של המתודות מהמנשק מימוש של מתודות המנשק כל עוד המתודות לא ממומשו יש שגיאת קומפילציה

המחלקה Circle public class Circle implements Shape { float radius; public Circle(float radius) { //Constructor this.radius=radius; } public float getArea() { //Implementing Shape.getArea() return (float) (radius*radius*Math.PI); public String getDetails() { //Implementing Shape.getDetails() return "Circle: radius=" + this.radius; public float getRadius() { //Circle specific method return this.radius;

טיפוס הפניה מסוג Shape טיפוס הפניה מסוג Shape יכול להצביע אל כל אובייקט המממש את המנשק Shape. ניתן לקרוא באמצעותו רק למתודות הכלולות בהגדרת המנשק. לדוג': shape1.getArea() כדי לקרוא למתודה הספציפית ל-Circle, יש לבצע הצרה באמצעות casting: Shape shape1 = new Square(100); Shape shape2 = new Circle(50); Circle circle = (Circle) shape2; // Down-casting System.out.println( circle.getRadius() );

כללי השמה נוספים ראינו השמה של עצם למשתנה מטיפוס מנשק (שהוא מממש). אי אפשר לעשות השמה בכיוון ההפוך, או בין שני טיפוסים שמממשים את אותו מנשק שוב, אפשר להיעזר ב-down-casing down-casting מאפשר "להתחכם" ולבצע השמה מוזרה במקרה כזה, השגיאה תתגלה רק בזמן ריצה (כשיתברר ש-myShape אינו עיגול) Square mySquare = new Square(100); Shape myShape = mySquare;   Square mySquare2 = myShape; Circle myCircle2 = mySquare; Square mySquare2 = (Square) myShape; Circle myCircle2 = (Circle) myShape;

גישה אחידה לאובייקטים ע"י שימוש במנשק Shape השימוש במנשקים מאפשר לנו לעבוד באופן אחיד עם אובייקטים של מחלקות שונות המממשות את המנשק. מערך פולימורפי יכיל אובייקטים מסוגים שונים. Shape[] shapes = new Shape[]{ new Square(10), new Circle(20), new Square(100) }; for (Shape shape : shapes) System.out.println( shape.getDetails() + "\t area=“ + shape.getArea() );

דוגמא 2: נגן מוזיקה דוגמא: נגן מוזיקה אשר מותאם לעבוד עם קבצי מוזיקה (mp3) ועם קבצי וידאו

Playing Mp3 public class MP3Song { public void play(){ // audio codec calculations, // play the song... { // does complicated stuff // related to MP3 format... public class Player { private boolean repeat; private boolean shuffle; public void playSongs(MP3Song[] songs) { do { if (shuffle) Collections.shuffle(Arrays.asList(songs)); for (MP3Song song : songs) song.play(); } while (repeat); } {

Playing VideoClips public class VideoClip { public void play(){ // video codec calculations, // play the clip ... { // does complicated stuff // related to MP4 format ... public class Player { // same as before... public void playVideos(VideoClip[] clips) { do { if (shuffle) Collections.shuffle(Arrays.asList(clips)); for (VideoClip videoClip : clips) videoClip.play(); } while (repeat); {

שכפול קוד נרצה למזג את שני קטעי הקוד למרות ששני השרותים נקראים play() public void playSongs(MP3Song[] songs) { do { if (shuffle) Collections.shuffle(Arrays.asList(songs)); for (MP3Song song : songs) song.play(); } while (repeat); } למרות ששני השרותים נקראים play() אלו פונקציות שונות! public void playVideos(VideoClip[] clips) { do { if (shuffle) Collections.shuffle(Arrays.asList(clips)); for (VideoClip videoClip : clips) videoClip.play(); } while (repeat); } נרצה למזג את שני קטעי הקוד

שימוש במנשק public void play (Playable[] items) { do { if (shuffle) Collections.shuffle(Arrays.asList(items)); for (Playable item : items) item.play(); } while (repeat); } public interface Playable { public void play(); }

מימוש המנשק ע"י הספקים public class VideoClip implements Playable { @Override public void play() { // render video, play the clip on screen... } // does complicated stuff related to video formats... public class MP3Song implements Playable { @Override public void play(){ // audio codec calculations, play the song... } // does complicated stuff related to MP3 format...

מערכים פולימורפים עבור כל איבר במערך יקרא ה play() המתאים Playable[] playables = new Playable[3]; playables[0] = new MP3Song(); playables[1] = new VideoClip(); playables[2] = new MP4Song(); // new Playable class Player player = new Player(); // init player... player.play(playables); public void play (Playable [] items) { do { if (shuffle) Collections.shuffle(Arrays.asList(items)); for (Playable item : items) item.play(); } while (repeat); } עבור כל איבר במערך יקרא ה play() המתאים

עוד על מנשקים לא ניתן ליצור מופע של מנשק בעזרת הפקודה new. מנשק יכול להכיל מתודות וגם קבועים אך לא שדות. מחלקה יכולה לממש יותר ממנשק אחד בג'אווה (תחליף לירושה מרובה). public class Circle implements Shape, Drawable {…} מנשק יכול להרחיב מנשק אחר (ואז יכלול גם את המתודות המוגדרות במנשק זה). public interface Shape extends Drawable {…}

פעולות על סיביות

פעולות על סיביות אופרטורים לביצוע פעולות על ביטים רק על טיפוסים שלמים (int, short, byte, char) Unary bitwise complement ~ Signed left shift << Signed right shift >> Unsigned right shift >>> Bitwise AND & Bitwise XOR ^ Bitwise OR |

פעולות על סיביות - דוגמאות int 32 ביטים מה נקבל מ i & 3? שני הביטים הימניים של i ומה נקבל מ i & 0xF0? ייצוג בינארי 00000000000000000000000000000011 3 11111111111111111111111111111100 ~3 11111111111111111111111111111101 -3 00000000000000000000000000001100 3 << 2 11111111111111111111111111111110 -3 >> 1 01111111111111111111111111111110 -3 >>> 1 0xF0 = 0000 0000…..1111 0000, ולכן נקבל את ביטים 4-7 הימניים

פענוח של הדפסת שגיאה (Stack Trace)

Interpreting a Stack Trace of an Exception כשנתקלים בחריגה במהלך ריצת התוכנית, ניתן להשתמש במידע שניתן לנו כדי לזהות את סוג החריגה ואת המיקום בתוכנית שבו היא ארעה. Console: Exception in thread "main" java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Author.getBookTitles(Author.java:25) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) Book.java: public String getTitle() { System.out.println(title.toString()); <-- line 16 return title; }

Interpreting a Stack Trace of an Exception דוגמא נוספת: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source) at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source) at java.lang.AbstractStringBuilder.append(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at SmallTestMultiCollections.testOrder(SmallTestMultiCollections.java:56) at SmallTestMultiCollections.main(SmallTestMultiCollections.java:34

The end