מבוא למדעי המחשב הרצאה 18: פולימורפיזם ומחלקות אבסטרקטיות 1.

Slides:



Advertisements
Similar presentations
Object Oriented 33 MCSD DORON AMIR
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
INTERFACES IN JAVA 1.Java Does not support Multiple Inheritance directly. Multiple inheritance can be achieved in java by the use of interfaces. 2.We need.
האוניברסיטה העברית בירושלים
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
תרגול 11 המשך תכנות מונחה עצמים 1. היום בתרגול מחלקות אבסטרקטיות ממשקים אופרטור instanceof 2.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
שאלות חזרה לבחינה. שאלה דיסקים אופטיים מסוג WORM (write-once-read-many) משמשים חברות לצורך איחסון כמויות גדולות של מידע באופן קבוע ומבלי שניתן לשנותו.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
אוניברסיטת בן גוריון - מבוא למדעי המחשב 1 תרגול מספר 10  ממשקים o כללים בסיסיים o מימוש מספר ממשקים o דוגמת ממשק כחוזה  הורשה o כללים בסיסיים o דריסה.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
הפקולטה למדעי המחשב אוטומטים ושפות פורמליות (236353)
1 הורשה ופולימורפיזם צורה ריבוע עיגול משושה. 2 מוטיבציה: מוטיבציה: אפליקציית חלונות טיפוסית – נעזרת בפקדים (Widgets) Button Textbox Label Form.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 7 ISP דוגמא נוספת.
אתחול עצמים. אתחולים ובנאים יצירת מופע חדש של עצם כוללת: הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי/ם של מחלקת הבסיס.
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
10/7/2015IT 1791 Java’s World in UML Object Shape {abstract} This is done implicitly Shape {abstract} - ShapeName: String # setShapeName(newShapeName:
Inheritance, Abstract & Interface Pepper With help from and
Inheritence Put classes into a hierarchy derive a new class based on an existing class with modifications or extensions. Avoiding duplication and redundancy.
Programming With Java ICS201 University Of Hail1 Chapter 13 Interfaces.
פיתוח מערכות מידע 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.
1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
1 תרגול 11: Design Patterns ומחלקות פנימיות 1 תוכנה 1.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
CSE 143 Lecture 20 Abstract classes. 2 Circle public class Circle { private double radius; public Circle(double radius) { this.radius = radius; } public.
Lecture Notes – Inheritance and Polymorphism (Ch 9-10) Yonglei Tao.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
Inheritance CSI 1101 Nour El Kadri. OOP  We have seen that object-oriented programming (OOP) helps organizing and maintaining large software systems.
1 / 71 COP 3503 FALL 2012 SHAYAN JAVED LECTURE 4 Programming Fundamentals using Java 1.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 מבוא למדעי המחשב הרצאה 5: פונקציות. 2 מבוא לפונקציות חלוקה של אלגוריתם לתת משימות: משימה - פונקציה: דוגמאות מציאת המקסימלי מבין שני איברים האינדקס של.
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 More About Derived Classes and Inheritance Chapter 9.
האוניברסיטה העברית בירושלים
Object Oriented Programming
תרגול מספר 9.
Tirgul 12 Trees 1.
Object Oriented Programming
Formal Specifications for Complex Systems (236368) Tutorial #1
Java’s World in UML Object Shape {abstract} This is done implicitly
Abstract Class, Interface, Package
Object Oriented Programming
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
מבוא לתכנות מונחה עצמים Object Oriented Programming
ממשקים - interfaces איך לאפשר "הורשה מרובה".
null, true, and false are also reserved.
Everything the light touches, Simba, will be yours
הכמסה – Encapsulation עקרון ההכמסה
מבוא לתכנות מונחה עצמים Object Oriented Programming
תרגול 10 המשך תכנות מונחה עצמים.
תוכנה 1 תרגול 13 – סיכום.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Announcements & Review
مظفر بگ محمدی دانشگاه ایلام
public class Dillo {     public int length;     public boolean isDead;         
Presentation transcript:

מבוא למדעי המחשב הרצאה 18: פולימורפיזם ומחלקות אבסטרקטיות 1

class Student public class Student { private static final int COURSE_PRICE = 1000; private String name; private int id; private int numOfCourses; public Student(int id, String name) { this.name = name; this.id = id; numOfCourses= 0; } public int computeTuition(){ return numOfCourses * COURSE_PRICE; } public void setNumOfCourses(int c) { numOfCourses = c; } … } //class Student 2

class Milgay public class Milgay extends Student { private int milga; public Milgay(int id, String name, int milga){ super(id, name); this.milga= milga; } public int computeTuition(){ return Math.max(0, super.computeTuition() – milga); } … } //class Milgay 3

הסטודנטים מוחים על שכר הלימוד עקב מחאה של אגודת הסטודנטים החליטה האוניברסיטה להגיע עם הסטודנטים להסדר ולשנות את מנגנון התשלומים, כך שהתשלום המקסימאלי לסטודנט הוא 2500 ₪ נוסיף למחלקה Student את הקבוע החדש MAX_PRICE, ואת השיטה computePayment() אשר תחשב את שכר הלימוד החדש 4

class Student public class Student { private static final int COURSE_PRICE = 1000; private static final int MAX_PRICE = 2500; private String name; private int id; private int numOfCourses; public Student(int id, String name) { this.name = name; this.id = id; numOfCourses= 0; } public int computeTuition (){ return numOfCourses * COURSE_PRICE; } public void setNumOfCourses(int c) { numOfCourses = c; } public int computePayment(){ return Math.min(MAX_PRICE, computeTuition()); } } //class Student 5

השפעת השינוי על סטודנט עתה נריץ את הקוד הבא : Student s = new Student(11,"Dani"); s.setNumOfCourses(3); System.out.println(s. getName() + " should pay " + s.computePayment()); הסטודנט יידרש לשלם 2500 ₪ במקום 3000 ₪, וכולם מרוצים. 6

השפעת השינוי על מלגאי עתה נריץ את הקוד הבא : Milgay m = new Milgay(12, "Moshe", 750); m.setNumOfCourses(3); System.out.println(m. getName() + “ should pay " + m.computePayment()); כמה ישלם המלגאי ? 7

השפעת השינוי על מלגאי - פולימורפיזם נבחן שתי אפשרויות : אם computePayment יקרא ל - computeTuition של Student יחושב שכר לימוד של 3000 ₪ וכתוצאה מחישוב המינימום ישלם הסטודנט 2500 ₪. אם computePayment יקרא ל - computeTuition של Milgay יחושב שכר לימוד של 2250 ₪ וכתוצאה מחישוב המינימום ישלם הסטודנט 2250 ₪. אם האפשרות הראשונה נכונה, סביר שהמלגאי יכעס על יו " ר האגודה, שגרם לו לשלם 250 ₪ יותר האפשרות הנכונה היא השנייה ( ליו " ר שלום...) 8

הסתרה של משתנים – עולם אחר נוסיף את השדה הבא גם ל -Student וגם ל -Milgay: private int grade; בנוסף, נוסיף למחלקה Student את הקוד : return grade;} } public int getGrade() ולמחלקה Milgay את הקוד : this.grade = grade;}} public void setGrade(int grade) עתה נריץ את השורות הבאות ב -main: m.setGrade(100); System.out.println(m.getName() + “ grade is " + m. getGrade()); מנגנון הפולימורפיזם לא פועל עבור משתנים ( גם לא עבור ציבוריים...) 9 0 ???

ומה לגבי שיטות private? נוסיף ל -Student את השיטות : public void printClassName () {System.out.println(className());} private String className(){return “Student";} ול -Milgay נוסיף את השיטה : private String className(){return “Milgay";} ונריץ את הקוד הבא : m.printClassName(); מנגנון הפולימורפיזם לא פועל בשיטות פרטיות 10 student

ההרשאה protected אם כמתכנתי המחלקה Student אנו רוצים לאפשר למחלקות יורשות את הגישה למשתנה מחלקה כלשהו (numOfCourses ו - COURSE_PRICE במקרה שלנו ) אך עדיין איננו מעוניינים לחשוף משתנה זה למשתמשים חיצוניים, ניתן לתת למשתנה זה את מציין ההרשאה protected 11

class Student public class Student { protected static final int COURSE_PRICE = 1000; private String name; private int id; protected int numOfCourses; public Student(int id, String name) { this.name = name; this.id = id; numOfCourses= 0; } public int computeTuition(){ return numOfCourses * COURSE_PRICE; } public void setNumOfCourses(int c) { numOfCourses = c; } … } //class Student 12

class Milgay public class Milgay extends Student { private int milga; public Milgay(int id, String name, int milga){ super(id, name); this.milga= milga; } public int computeTuitionFee(){ return (numOfCourses * COURSE_PRICE) - milga; } … } //class Milgay 13

מחלקות אבסטרקטיות רוצים לכתוב קוד המייצג מיכלים מסוגים שונים צורות שונות : קופסא, חבית, קובייה שיטות : משותפות : הוספת נוזל, תכולה, האם מלא ? שונות : בנאים, חישוב קיבולת האם ירושה מתאימה במקרה כזה ? האם יש אובייקט ממשי שנקרא מיכל ? 14

אולי ממשקים יעזרו ? public interface Tank { public double capacity(); public double getContent(); public void fill(double amount); public boolean isFull(); } 15

קופסא public class Box implements Tank { private double contents; private double length; private double width; private double height; //… (constructors) public void fill(double amount){ contents = Math.min(contents + amount, capacity()); } public double getContents(){ return contents; } 16

קופסא public boolean isFull(){ return (contents == capacity()); } public double capacity(){ return length*width*height; } } //class Box 17

חבית public class Cylinder implements Tank{ private double contents; private double radius; private double height; //… (constructors) public void fill(double amount){ contents = Math.min(contents + amount, capacity()); } public double getContents(){ return contents; } 18

חבית public boolean isFull(){ return (contents == capacity()); } public double capacity(){ return height * Math.PI * radius * radius; } }//class Cylinder 19

חסרון : אותו הקוד מופיע במספר מחלקות 20

הפתרון : מחלקות מופשטות public abstract class Tank{ private double contents; public abstract double capacity(); 21

הפתרון : מחלקות מופשטות public abstract class Tank{ private double contents; public Tank(){ contents = 0; } public abstract double capacity(); 22

public void fill(double amount){ contents = Math.min(contents + amount, capacity()); } public double getContents(){ return contents; } public boolean isFull(){ return contents == capacity(); } } // class Tank 23

עכשיו ניתן להשתמש בהורשה public class Cylinder extends Tank{ private double radius; private double height; public Cylinder(double radius, double height){ super(); this.radius = radius; this.height = height; } public double capacity(){ return height * Math.PI * radius * radius; } } 24

קופסא class Box extends Tank{ private double length; private double width; private double height; public Box(double length, double width, double height){ super(); this.length = length; this.width = width; this.height = height; } public double capacity(){ return length * width * height; } } 25

קובייה היא גם קופסא class Cube extends Box{ public Cube(double side){ super(side, side, side); } 26

ומה אם ? public class Tank{ private double contents; public Tank(){ contents = 0; } public abstract double capacity(); Tank should be declared abstract; it does not define capacity() in Tank 27

ומה אם ? public abstract class Tank{ private double contents; public Tank(){ contents = 0; } public double capacity(); missing method body, or declare abstract 28

public class Cylinder extends Tank{ private double radius; private double height; public Cylinder(double radius, double height){ super(); this.radius = radius; this.height = height; } ומה אם ? Cylinder should be declared abstract; it does not define capacity() in Tank 29

Tank t1 = new Cube(5); Tank t2 = new Tank(); ומה קורה כשמנסים ליצור מופע ? לא ניתן ליצור מופע של מחלקה אבסטרקטית! 30 X √

גם כאן אפשר protected 31 נניח כי אנו רוצים לאפשר למחלקות היורשות מ -Tank גישה ישירה לשדה contents: public abstract class Tank{ protected double contents; … }

גם שיטות יכולות להיות protected 32 נניח כי אנו רוצים לדרוס ב -Tank את toString, כך שהמחרוזת המודפסת תכלול את סוג המיכל, קיבולתו ותוכנו : public abstract class Tank{ … public String toString(){ return concreteClassName() + ", capacity: " + capacity() + ", contents: " + contents; } protected abstract String concreteClassName(); }// class Tank

ועתה נתקן את המחלקות היורשות public class Box extends Tank{ … protected String concreteTankClassName() { return "Box"; } }//class Box public class Cylinder extends Tank{ … protected String concreteTankClassName() { return "Cylinder"; } }//class Cylinder

הערות מחלקות אבסטרקטיות וממשקים : במחלקה אבסטרקטית ניתן לממש חלק מהשיטות והבנאים, וכן להגדיר שדות. בממשק – לא. מחלקה יכולה לממש מספר ממשקים, אך לרשת מחלקה אחת בלבד (בפרט לרשת מחלקה אבסטרקטית אחת). אם מחלקה אבסטרקטית מכילה שיטות אבסטרקטיות בלבד, זה סימן שהיה נכון יותר לכתוב אותה כממשק. מחלקה אבסטרקטית יכולה "לממש" ממשק מבלי באמת לממש את כל השיטות בממשק. במקרה זה, ניתייחס לשיטות כאלו כשיטות אבסטרקטיות. מחלקה אבסטרקטית לא חייבת להכיל שיטות אבסטרקטיות. 34

גן החיות שלנו חיה ציפור יונק חתולכלב 35

ההגדרה של חיה public abstract class Animal { private String name; public String getName(){return name;} public Animal (String name){ this.name = name; } abstract public void eat(); abstract public void speak(); } 36

ציפור public class Bird extends Animal { public Bird(String name){ super(name); } public void eat(){ System.out.println(getName()+" eats Bissli"); } public void speak(){ System.out.println("Twit twit"); } } 37

יונק public abstract class Mammal extends Animal { public Mammal(String name){ super(name); } public void mammalSpecial(){ System.out.println("I’m a mammal!"); } } 38

כלב public class Dog extends Mammal { public Dog(String name){ super(name); } public void eat(){ System.out.println(getName()+" eats Dogli"); } public void speak(){ System.out.println("Wouf!"); } } 39

חתול public class Cat extends Mammal { public Cat(String name){ super(name); } public void eat(){ System.out.println(getName()+" eats Catli"); } public void speak(){ System.out.println("Meow"); } public void purr(){ System.out.println("Purr"); } } 40

הקמת הגן Scanner sc = new Scanner(System.in); Animal[] zoo = new Animal [10]; for (int i=0; i<zoo.length; i= i+1){ System.out.println("What animal do you want?"); String type = sc.next(); System.out.println(“How would you like to call it?"); if (type.equals("Dog")) zoo[i] = new Dog(sc.next()); else if (type.equals("Cat")) zoo[i] = new Cat(sc.next()); else zoo[i] = new Bird(sc.next()); } 41

אוכל וסיפור for (int i=0; i<zoo.length; i= i+1){ zoo[i].eat(); zoo[i].speak(); if (zoo[i] instanceof Mammal){ ((Mammal)zoo[i]).mammalSpecial(); if (zoo[i] instanceof Cat) ((Cat)zoo[i]).purr(); } } 42