Download presentation
Presentation is loading. Please wait.
1
Implementing Polymorphism
2
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
3
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
4
Polymorphism Basics and virtual Methods
ייחוס מטיפוס הבסיס יכול להתייחס לאובייקט מהמחלקה הנגזרת. class Base { public void Func() {…} } class Derived:Base public new void Func() {…} class App { static void Main() Base b = new Derived(); b.Func(); } איזו מתודה תופעל?
5
Polymorphism Basics and virtual Methods
בעיה ! ייחוס מטיפוס הבסיס יכול לקבל כתובת של אובייקט ממחלקה נגזרת, אולם אותו ייחוס יכיר רק את החברים (Data Members and Methods) אשר מוגדרים במחלקת הבסיס. הפיתרון : מתודות וירטואליות.
6
Polymorphism Basics and virtual Methods
נהוג לאמר, שהמחלקה הנגזרת יכולה לדרוס/לרמוס (Override) את המימוש הקיים במחלקת הבסיס. כאשר נפעיל מתודה וירטואלית יופעל המימוש המתאים לטיפוס האובייקט המוקצה ולא לייחוס, במילים אחרות, המימוש יופעל על פי האובייקט המוקצה דינאמית ולא על פי הייחוס המחזיק בכתובת ההקצאה. הגדרת מתודה וירטואלית מתבצעת באמצעות המילה השמורה (keyword) virtual, הגדרת מימוש נוסף מחייבת שימוש המילה השמורה override. מתודה וירטואלית אינה יכולה להיות static וכמובן שאינה יכולה להיות private.
7
Polymorphism Basics and virtual Methods
דוגמה: class Base { public virtual void Func() {…} } class Derived:Base public override void Func() {…} class App { static void Main() Base b = new Derived(); b.Func(); } איזו מתודה תופעל הפעם?
8
Polymorphism Basics and virtual Methods
כללים במימוש מתודות וירטואליות: החתימה של המתודה הוירטואלית המוגדרת במחלקת הבסיס חייבת להיות זהה בכל (שם המתודה, פרמטרים, ערך מוחזר, הרשאת גישה) לחתימה של המימושים הנוספים שלה במחלקה הנגזרת. ניתן להמשיך ולספק למתודה וירטואלית אשר מוגדרת במחלקת הבסיס מימושים נוספים בשאר המחלקות הנגזרות. לא ניתן להגדיר מתודות static כוירטואליות. virtual מתייחס להתנהגות של אובייקטים ומחלקות. לא ניתן להגדיר מתודות private כוירטואליות, משום שלא ניתן יהיה לממשם במחלקה הנגזרת. לא ניתן להגדיר בצורה מפורשת override כ- virtual למרות שהיא וירטואלית.
9
Polymorphism Basics and virtual Methods
New Virtual ניתן להגדיר מתודה וירטואלית כ- new, המשמעות היא שהאובייקט לא יכיר את המימושים הקודמים של המתודה הוירטואלית אשר הוגדרו המחלקות הבסיס, ויחביא את כל המתודות בעלות החתימה הזהה שהוגדרו קודם לכן בעץ ההורשה. מבחינתו מדובר במתודה חדשה לגמרי ללא שום שייכות למתודה הוירטואלית והמימושים הנוספים שלה שהוגדרו קודם לכן ב"עץ ההורשה". Syntax: public new virtual void Func(…) { }
10
Polymorphism Basics and virtual Methods
New Virtual לדוגמה: class Base { public virtual void Print() . . . } class Derived1:Base public override void Print()
11
Polymorphism Basics and virtual Methods
class Derived2:Derived1 { public new virtual void Print() . . . } class App static void Main(string[] args) Base b1 = new Derived1(); b1.Print(); Base b2 = new Derived2(); b2.Print(); New Virtual המשך:
12
Polymorphism Basics and virtual Methods
המתודות הוירטואליות מאפשרות להתייחס אל כל המחלקות בהיררכיה בצורה זהה ובכל זאת לא לוותר על הייחודיות של כל מחלקה ומחלקה נגזרת ולהביא את ההתנהגות הייחודית שלה לידי ביטוי. בצורה זו קל מאוד לעבוד עם ההיררכיה וקל לתחזק אותה. מתודות וירטואליות מאטות את קצב ביצוע התוכנית משום שהקישור מתבצע בזמן ריצה (Late Binding).
13
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
14
Conversions Between Base and Derived
C# מאפשרת לבצע המרות (Conversions) מייחוס ממחלקת הבסיס לייחוס מהמחלקה הנגזרת ולהפך - מייחוס מהמחלקה הנגזרת לייחוס ממחלקת הבסיס. אין שום סכנה בביצוע המרה מהמחלקה הנגזרת למחלקה הבסיסית וניתן לבצע אותה באופן מרומז (Implicit). המרה הפוכה, מהמחלקה הבסיסית לייחוס של המחלקה הנגזרת, יכולה להיות מסוכנת. במקרים רבים נהיה חייבים לבצע בדיקות לפני ביצוע ההמרה על מנת לוודא שאכן מדובר במחלקה הנכונה. המרה זו חייבים לבצע בצורה מפורשת (Explicit). מטרת ההמרה מייחוס ממחלקת הבסיס לייחוס מהמחלקה הנגזרת היא הפעלת אלמנטים ייחודיים של המחלקה הנגזרת שאינם באים לידי ביטוי במחלקת הבסיס. C# מגדירה שני אופרטורים שבהם נעזר על מנת לבצע המרות בטוחות יותר: האופרטור is , והאופרטור as .
15
Conversions Between Base and Derived
לדוגמה: BaseShape b = new Circle(…); . . . Rectangle r = (Rectangle) b; שורות אלו הן בעיתיות והן יגרמו להתרסקות התוכנית, משום שהייחוס b מכיל כתובת של אובייקט מהמחלקה Circle ולא Rectangle .
16
Conversions Between Base and Derived
צורך זה של זיהוי טיפוס בזמן ריצה אינו בריא, תיכנון נכון והגדרת מתודות וירטואליות אמורה למנוע את הצורך הזה כמעט לחלוטין. לא ניתן להמנע מכך לחלוטין, בוודאי שלא בשלב התחזוקה בו מתגלים צרכים חדשים ומתווספות מחלקות חדשות לפרוייקט. לעיתים קרובות התכנון המקורי לא לקח בחשבון את ההתנהגויות הנדרשות מהן, ולכן הם מגדירות מתודות רגילות. לעיתים הצורך נוצר בתהליך האבולוציה שהתוכנית עוברת. על מנת להפעיל את אותן מתודות רגילות יש להסתכן ולבצע המרות אלו.
17
Conversions Between Base and Derived
על מנת לבצע המרה בצורה בטוחה ניעזר באופרטור IS. לדוגמה: class App { static void Main() BaseShape b = new Rectangle(); if (b is Rectangle) r = (Rectangle) b; r.PrintRectangle(); } else c = (Circle) b; c.PrintCircle();
18
Conversions Between Base and Derived
לדוגמה: class App { static void Main() Base b = new Derived1(); Derived1 r1 = b as Derived1; Derived2 r2 = b as Derived2; (if (r1 != null b.Print(); if (r2 != null) }
19
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
20
The Object class המחלקה Object הנה המחלקה הבסיסית ביותר ב- .NET Framework . כל הטיפוסים המוגדרים ב-C# , הן Value types והן Reference types, כמו גם כל הטיפוסים שנגדיר במהלך חיינו המקצועיים ב- C# ירשו את המחלקה Object בצורה מפורשת (Explicit) או מרומזת (Implicit). הורשה זו מבטיחה שכל מחלקה תציע לפחות אוסף מינימלי של פעילויות שימושיות ומשותפות.
21
The Object class מתודות: public virtual bool Equals(object)
מימוש שיטה זו מחייב מימוש של המתודה Object. GetHashCode() public virtual int GetHashCode() שיטה זו נממש על מנת שתחזיר Unique ID של אובייקט (Hash code). שימושי ל- HashTables .
22
The Object class מתודות: public Type GetType()
משמשת על מנת לזהות את הטיפוס בזמן ריצה (Reflections). public virtual string ToString() שיטה זו כפי שהיא ממומשת ב- Object ,מחזירה את שם המחלקה , מקובל שמימוש מחדש יחזיר תיאור קצר של ערכי האובייקט. ניתן לתאר באמצעות מתודה זו את ה- state בו נמצא האובייקט.
23
The Object class דוגמה: class Person:Object {
private string m_FirstName; private string m_LastName; private byte m_Age; private int m_ID; public Person () {…} public Person(string first,string last,byte age, int id){...} public void SetPerson(string first,string last,byte age, int id) {…} public void PrintPerson() { … }
24
The Object class המשך: public override bool Equals(Object obj) {
if(obj is Person) Person p; p = (Person)obj; if(this.m_FirstName == p.m_FirstName && this.m_LastName == p.m_LastName && this.m_Age == p.m_Age && this.m_ID == p.m_ID) return true; } return false; public override int GetHashCode() return this.m_ID; public override string ToString() return m_LastName + "," + m_FirstName + "," + m_Age; { המשך:
25
The Object class דוגמה: class App { static void Main(string[] args)
Person p1 = new Person("Grisha","Abootbool",12,2345); Person p2 = new Person("Muchamad","Yankelevitch",34,678); Person p3 = new Person("Muchamad","Yankelevitch",34,678); if(p1.Equals(p2)) Console.WriteLine("Objects are equals"); else Console.WriteLine("Objects are not equals"); if(p2.Equals(p3)) Console.WriteLine("Objects are the equals"); Console.WriteLine(p1.ToString()); }
26
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
27
Abstract Classes and Abstract Methods
מחלקה מופשטת (או מחלקה אבסטרקטית) הנה מחלקה אשר לא ניתן לייצר/להקצות ממנה אובייקטים, מטרתה לשמש כמחלקת בסיס בלבד. מחלקה מופשטת יכולה בעצמה לרשת מחלקה רגילה או מחלקה מופשטת אחרת. מחלקה מופשטת מגדירים בעזרת מילת המפתח (Keyword) abstract. Syntax: abstract class BaseClass { . . . }
28
Abstract Classes and Abstract Methods
דוגמה: abstract class Base { public virtual void Print() Console.WriteLine("Base class"); } class Derived:Base public override void Print() Console.WriteLine("Derived class");
29
Abstract Classes and Abstract Methods
המשך: class App { static void Main(string[] args) Base b = new Derived(); b.Print(); Derived d = new Derived(); d.Print(); }
30
Abstract Classes and Abstract Methods
מתודה מופשטת הנה מתודה וירטואלית אשר אין לה מימוש במחלקה בה היא מוגדרת, אולם חייבים לממשה במחלקה הנגזרת. C# מאפשרת להגדיר גם מאפיינים מופשטים (Abstract Properties). למרות שמתודה מופשטת או מאפיין מופשט הם וירטואליים, לא ניתן להגדירם כוירטואליים בצורה מפורשת. הגדרתם כוירטואליים היא הגדרה מרומזת (Implicit) ומתבצעת אוטומטית על ידי הסביבה
31
Abstract Classes and Abstract Methods
Syntax: abstract class Sample { public abstract void FuncName(); public abstract int Num get; set; }
32
Abstract Classes and Abstract Methods
דוגמה: abstract class Base { protected int m_Num; public Base() { … } public abstract void PrintMsg(); public abstract void Print(); public abstract int Num get; set; }
33
Abstract Classes and Abstract Methods
המשך : class Derived:Base { private string m_Str; public Derived() m_Str = "Empty String"; } public Derived(int num,string str):base(num) this.m_Str = str;
34
Abstract Classes and Abstract Methods
המשך : public override void PrintMsg() { … } public override void Print() { … } public override int Num. { get { … } set { … } } public string Str
35
Abstract Classes and Abstract Methods
המשך : class Derived2:Derived { public override void PrintMsg() Console.WriteLine("Stam Message 2"); } המחלקה Derived2 אינה מוסיפה מימוש משל עצמה למאפיין Num . האם היא תעבור קומפילציה.
36
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
37
Design Issues לשימוש בפולימורפיזם יש מחיר, האטה בביצוע, ולכן כאשר לא צריך להגדיר Virtual Method אין טעם להגדירן. אין טעם לשלם את המחיר אולם לא לקבל תמורה הולמת בעדו. מחלקות אשר אינו מייצגות אובייקטים במציאות אלא משמות כ"סיווג" נגדיר תמיד כ- abstract class . מתודות אשר אין טעם לממש במחלקת הבסיס, או שהמימוש הוא מאולץ (כגון: return 0;) נגדיר כ- Abstract Method . במידה ויש מספר מקרים של צורך להמיר ייחוס מטיפוס בסיס לייחוס מטיפוס המחלקה הנגזרת יש לבדוק האם אין בעיה תכנונית/עיצובית. פולימורפיזם הוא לא קשה, לא מורכב, לא נושך ולא בועט. פולימורפיזם הוא טוב במידה, ורע כאשר מגזימים. פולימורפיזם מקל מאוד על התחזוקה.
38
Design Issues Generic code - את ההתנהגויות המשותפות נגדיר במחלקת הבסיס כמתודות רגילות, את ההתמחות של המחלקות הנגזרות נגדיר ונממש בעזרת מתודות וירטואליות. היתרונות : מימוש אלגוריתם פעם אחת בלבד ויחידה, במחלקת הבסיס. במידה ויש שגיאה לוגית באלגוריתם, התיקון יתבצע במקום אחד בלבד. בהוספת מחלקה חדשה יש צורך רק לממש את הייחודיות שלה . כל האלגוריתמים המשותפים ממומשים כבר במחלקת הבסיס. מונע במקרים רבים את הצורך להמיר בין ייחוס ממחלקת הבסיס לייחוס מהמחלקה הנגזרת, פעולה שאם אינה מתבצעת בזהירות עלולה לגרום לפיצוץ התוכנית . 4 – מאפשר להתייחס לאובייקטים מהמחלקות השונות היורשות את אותה מחלקת בסיס בצורה זהה באמצעות מחלקת הבסיס. מייצר קוד אחיד לכל ההיררכיה.
39
Agenda Polymorphism Basics and virtual Methods.
Conversions Between Base and Derived. The Object class. Abstract Classes and Abstract Methods. Design Issues.
40
Books Corner – הוצאת ספרים מקוונת
Books Corner – הוצאת ספרים מקוונת
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.