SlideShare a Scribd company logo
1 of 3
Download to read offline
‫בדרך לפולימורפיזם – העמסת ועקיפת פונקציות‬

 ‫בעולם התוכן של תכנות מונחה עצמים ושל כתיבת קוד בכלל קיימת שאיפה תמידית לכתוב קוד כמה שיותר‬
  ‫פולימורפי – ג' נרי כך שנוכל להשתמש ביעילות ובחסכוניות באותן שורות קוד לביצוע פעולות בעלות אופי‬
                        ‫דומה, על פני שימוש חוזר, שכפול קוד והזזה של נתונים ממקום למקום שלא לצורך.‬
     ‫פולימורפיזם, משמעותו, מצב בו קיימות מספר פונקציות שעל אף העובדה שהן חולקות את אותו השם,‬
                                                                         ‫הן מבצעות פעולות שונות.‬
      ‫ראשית, נעסוק בהבדלים בין העמסת פונקציות לעקיפת פונקציות בדרך לכתיבת קוד פולימורפי יותר.‬
              ‫הגורם העיקרי המבדיל בין "העמסת" ל"עקיפת" פונקציות הוא מיקומן בהיררכיה המחלקתית.‬
 ‫כפי שנהוג לציין בספרות, "העמסת פונקציה" נעשית בצורה אופקית, כלומר הקשר הוא בין פונקציות בעלות‬
   ‫אותו שם הנמצאות באותה דרגה של הורשה בהיררכיה המחלקתית, כאשר ההבדל היחיד בינהן הוא מספר‬
      ‫ו/או סוג הפרמטרים שהן מקבלות, בעוד "עקיפת פונקציה" נעשית בצורה אנכית, כלומר הקשר הוא בין‬
           ‫פונקציות זהות לחלוטין הנמצאות ברמות שונות בהיררכיה המחלקתית, קרי, פועלות בקשר שבין‬
                   ‫ה – ‪ base class‬ל – ‪ ,derived class‬או אם תרצו, הקשר שבין האבא והבן ( או הבת :-) ).‬

                                                                            ‫העמסת פונקציות‬
          ‫היתרון הבולט ביותר בהעמסת פונקציות הוא היכולת להשתמש "באותה פונקציה" בדרכים שונות.‬
                                                                                 ‫נראה דוגמה:‬
 ‫נניח וקיימת מחלקה בשם ‪ Robot‬ובמחלקה זו העמסנו את הפונקציה ‪ SetData‬באופן כזה שהיא יכולה לקבל‬
                                                 ‫פרמטר אחד, שני פרמטרים או לא לקבל פרמטרים בכלל:‬

‫} ;‪void SetData( ) { cout << "You have not set any data..." << endl‬‬
‫} ;‪void SetData ( int x ) { cout << "Data Recorded: " << x << endl‬‬
‫} ;‪void SetData ( int x, int y ) { cout << "Data Recorded: " << x << " " << y << endl‬‬
                                                     ‫ונניח וקיים הרובוט 2‪ ,R2D‬אז נוכל לבצע הקריאות:‬
‫;) (‪R2D2.SetData‬‬
‫;)5(‪R2D2.SetData‬‬
‫;)9,7(‪R2D2.SetData‬‬
                                                                                   ‫ולצפות לפלט הבא:‬
‫...‪You have not set any data‬‬
‫5 :‪Data Recorded‬‬
‫9 7 :‪Data Recorded‬‬
‫ברצוני להציג דוגמה עקיפה לעניין זה. סוג של אנקדוטה קטנה, שאני מרגיש שיש צורך לעמוד על קיומה.‬
      ‫נניח ו ‪ SetData‬הוא קונסטרקטור אשר ברצוננו "להעמיס" (שימו לב. אני בכוונה מציין את המרכאות על‬
‫המושג להעמיס), כך שיקבל 2 פרמטרים, פרמטר יחיד או לא יקבל פרמטרים בכלל, אך בהיעדר הזנת אחד או‬
                                     ‫יותר מהערכים, אנו נשתמש בערכי ברירת מחדל שהוגדרו מראש.‬
                                                     ‫ההצהרה על הקונסטרקטור תיעשה באופן הבא:‬
‫;) 0=‪void SetData ( int=0, int=0, int‬‬
                                                                             ‫ומימוש שלו ייראה כך:‬
‫;} ... { ) ‪void SetData ( int x, int y, int z‬‬
        ‫אם כן, לא באמת ביצענו העמסת פונקציה במקרה זה, הרי שיש לנו הצהרה אחת, ומימוש אחד עבור‬
      ‫הקונסטרקטור שבדוגמה ואמרנו קודם, שבהעמסה, אנו נממש את הפונקציה מס' פעמים עם זהות בשם‬
                                                       ‫הפונקציה ושוני במספר הפרמטרים או סוגם.‬
                                                  ‫הסיבה שבגינה ציינתי דוגמה זו, היא צד המשתמש.‬
   ‫עבור המשתמש, מדובר לכאורה בפונקציה שהועמסה, שהרי הוא יכול לקרוא לה עם שני פרמטרים, פרמטר‬
                                                          ‫בודד או ללא פרמטרים כלל. מעניין, נכון?‬
‫עקיפת פונקציות‬

‫עבור עקיפת פונקציות, נציין את הגישה הישירה לביצוע העקיפה, ובמימושים מתקדמים יותר, נעסוק בהמשך.‬
  ‫היתרון העיקרי בעקיפת פונקציות הוא היכולת "להגדיר מחדש" פונקציה שעברה בירושה מה– ‪Base Class‬‬
                ‫כך שתישאר בעלת אותו השם ואותן התכונות, אך תבצע פעולה מותאמת אישית עבור היורש.‬

                                                                      ‫נוכל לראות זאת בדוגמה הבאה:‬
                             ‫נניח וקיימת מחלקה בשם ‪ Robot‬ולה תתי מחלקות בשמות 2‪ R2D‬ו ‪.Optimus‬‬
‫כשמריצים את הפונקציה ;) (‪ WhatAreYou‬על הרובוט ב- ‪ Base Class‬הוא עונה "אני רובוט אב", ומכאן שגם‬
   ‫הבנים שלו ירשו את היכולת לענות תשובה זו, אך ברור לכל שהתשובה "אני רובוט בן" היא הנכונה עבורו.‬
   ‫כמובן שיכולנו ליצור פונקציה נוספת בשם ;) (2‪ WhatAreYou‬למשל, בה יוכל הבן לומר מי הוא באמת, אך‬
    ‫ברצוננו לשמור על המבנה הנוכחי מבלי להוסיף פונקציות מיותרות שרק יעמיסו על הקוד ועלולות לגרום‬
                                             ‫לבלבול עקב האפשרות של הבן "לשקר" ולומר שהוא אב...‬
‫על כן, עלינו לבצע "עקיפת פונקציה" על מנת להתאים אותה לצרכי הבן. אנו נבצע זאת על ידי שימוש בהגדרת‬
  ‫פונקציה הזהה לחלוטין לזו של האב (הדבר אפשרי היות והפונקציות נמצאות ברמות היררכיה שונות), ובכך‬
                                                               ‫"לדרוס" את פונקצית האב באופן הבא:‬

‫{ ‪class Robot‬‬
‫}} ;‪void WhatAreYou( ) { cout << "I'm Robot, The father of all robots" << endl‬‬
‫{ ‪class R2D2: public Robot‬‬
‫}} ;‪void WhatAreYou( ) { cout << "I'm R2D2, The child of class Robot!" << endl‬‬
‫{ ‪class Optimus: public Robot‬‬
‫}} ;‪void WhatAreYou( ) { cout << "I'm Optimus, The child of class Robot!" << endl‬‬


    ‫ובהנחה וקיימים הרובוטים ;1‪ ,Optimus robot3;, R2D2 robot2;, Robot robot‬נוכל לבצע את הקריאות‬
                                                                                           ‫הבאות:‬
‫;) (‪robot1.WhatAreYou‬‬
‫;) (‪robot2.WhatAreYou‬‬
‫;) (‪robot3.WhatAreYou‬‬
                                                                                 ‫ולצפות לפלט הבא:‬
‫!‪I'm Robot, The father of all robots‬‬
‫!‪I'm R2D2, The child of class Robot‬‬
‫!‪I'm Optimus, The child of class Robot‬‬

More Related Content

What's hot

Python – Object Oriented Programming
Python – Object Oriented Programming Python – Object Oriented Programming
Python – Object Oriented Programming Raghunath A
 
SQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתוניםSQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתוניםמורן אלקובי
 
מצגת לוגיקה מלאה חלק 2 מתוך 3
מצגת לוגיקה מלאה חלק 2 מתוך 3מצגת לוגיקה מלאה חלק 2 מתוך 3
מצגת לוגיקה מלאה חלק 2 מתוך 3מורן אלקובי
 
Fundamentals of OOP (Object Oriented Programming)
Fundamentals of OOP (Object Oriented Programming)Fundamentals of OOP (Object Oriented Programming)
Fundamentals of OOP (Object Oriented Programming)MD Sulaiman
 
סיכום של הקורס כלים מתמטיים למדעי המחשב
סיכום של הקורס כלים מתמטיים למדעי המחשבסיכום של הקורס כלים מתמטיים למדעי המחשב
סיכום של הקורס כלים מתמטיים למדעי המחשבcsnotes
 
classes and objects in C++
classes and objects in C++classes and objects in C++
classes and objects in C++HalaiHansaika
 
object oriented programing lecture 1
object oriented programing lecture 1object oriented programing lecture 1
object oriented programing lecture 1Geophery sanga
 
Learn C# Programming - Decision Making & Loops
Learn C# Programming - Decision Making & LoopsLearn C# Programming - Decision Making & Loops
Learn C# Programming - Decision Making & LoopsEng Teong Cheah
 
C++ Files and Streams
C++ Files and Streams C++ Files and Streams
C++ Files and Streams Ahmed Farag
 
Polymorphism in Java by Animesh Sarkar
Polymorphism in Java by Animesh SarkarPolymorphism in Java by Animesh Sarkar
Polymorphism in Java by Animesh SarkarAnimesh Sarkar
 
2CPP09 - Encapsulation
2CPP09 - Encapsulation2CPP09 - Encapsulation
2CPP09 - EncapsulationMichael Heron
 
B.sc CSIT 2nd semester C++ Unit5
B.sc CSIT  2nd semester C++ Unit5B.sc CSIT  2nd semester C++ Unit5
B.sc CSIT 2nd semester C++ Unit5Tekendra Nath Yogi
 
Object oriented programming with python
Object oriented programming with pythonObject oriented programming with python
Object oriented programming with pythonArslan Arshad
 

What's hot (20)

Basics of Java
Basics of JavaBasics of Java
Basics of Java
 
Object oriented programming With C#
Object oriented programming With C#Object oriented programming With C#
Object oriented programming With C#
 
Python: Basic Inheritance
Python: Basic InheritancePython: Basic Inheritance
Python: Basic Inheritance
 
Python – Object Oriented Programming
Python – Object Oriented Programming Python – Object Oriented Programming
Python – Object Oriented Programming
 
SQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתוניםSQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתונים
 
מצגת לוגיקה מלאה חלק 2 מתוך 3
מצגת לוגיקה מלאה חלק 2 מתוך 3מצגת לוגיקה מלאה חלק 2 מתוך 3
מצגת לוגיקה מלאה חלק 2 מתוך 3
 
Fundamentals of OOP (Object Oriented Programming)
Fundamentals of OOP (Object Oriented Programming)Fundamentals of OOP (Object Oriented Programming)
Fundamentals of OOP (Object Oriented Programming)
 
סיכום של הקורס כלים מתמטיים למדעי המחשב
סיכום של הקורס כלים מתמטיים למדעי המחשבסיכום של הקורס כלים מתמטיים למדעי המחשב
סיכום של הקורס כלים מתמטיים למדעי המחשב
 
01 curso poo Funciones
01 curso poo Funciones01 curso poo Funciones
01 curso poo Funciones
 
Methods and constructors in java
Methods and constructors in javaMethods and constructors in java
Methods and constructors in java
 
classes and objects in C++
classes and objects in C++classes and objects in C++
classes and objects in C++
 
object oriented programing lecture 1
object oriented programing lecture 1object oriented programing lecture 1
object oriented programing lecture 1
 
Learn C# Programming - Decision Making & Loops
Learn C# Programming - Decision Making & LoopsLearn C# Programming - Decision Making & Loops
Learn C# Programming - Decision Making & Loops
 
C++ Files and Streams
C++ Files and Streams C++ Files and Streams
C++ Files and Streams
 
OOPS Basics With Example
OOPS Basics With ExampleOOPS Basics With Example
OOPS Basics With Example
 
Polymorphism in Java by Animesh Sarkar
Polymorphism in Java by Animesh SarkarPolymorphism in Java by Animesh Sarkar
Polymorphism in Java by Animesh Sarkar
 
2CPP09 - Encapsulation
2CPP09 - Encapsulation2CPP09 - Encapsulation
2CPP09 - Encapsulation
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
B.sc CSIT 2nd semester C++ Unit5
B.sc CSIT  2nd semester C++ Unit5B.sc CSIT  2nd semester C++ Unit5
B.sc CSIT 2nd semester C++ Unit5
 
Object oriented programming with python
Object oriented programming with pythonObject oriented programming with python
Object oriented programming with python
 

Similar to בדרך לפולימורפיזם - העמסת ועקיפת פונקציות

בדרך לפולימורפיזם - Using Virtual/Pure Virtual
בדרך לפולימורפיזם - Using Virtual/Pure Virtualבדרך לפולימורפיזם - Using Virtual/Pure Virtual
בדרך לפולימורפיזם - Using Virtual/Pure Virtualמורן אלקובי
 
הורשה והיררכיה של מחלקות
הורשה והיררכיה של מחלקותהורשה והיררכיה של מחלקות
הורשה והיררכיה של מחלקותמורן אלקובי
 
תכנות מונחה עצמים - מחלקות
תכנות מונחה עצמים - מחלקותתכנות מונחה עצמים - מחלקות
תכנות מונחה עצמים - מחלקותמורן אלקובי
 
לימוד תיכנות תיאורי (Descriptive Programming) ב-QTP
לימוד תיכנות תיאורי (Descriptive Programming) ב-QTPלימוד תיכנות תיאורי (Descriptive Programming) ב-QTP
לימוד תיכנות תיאורי (Descriptive Programming) ב-QTPYaron Assa
 
ActionScript 3.0-מדריך בסיסי ל
ActionScript 3.0-מדריך בסיסי לActionScript 3.0-מדריך בסיסי ל
ActionScript 3.0-מדריך בסיסי לguest2dbc78
 
C# .net lecture 2 Objects 2
C# .net lecture 2 Objects 2C# .net lecture 2 Objects 2
C# .net lecture 2 Objects 2Doron Raifman
 
C# .net lecture 1 in Hebrew
C# .net lecture 1 in HebrewC# .net lecture 1 in Hebrew
C# .net lecture 1 in HebrewDoron Raifman
 
תכנות מדעי: פייתון: הרצאה 10: : תחום הכרעה
תכנות מדעי: פייתון: הרצאה 10: : תחום הכרעהתכנות מדעי: פייתון: הרצאה 10: : תחום הכרעה
תכנות מדעי: פייתון: הרצאה 10: : תחום הכרעהIgor Kleiner
 
ModProg.pdf
ModProg.pdfModProg.pdf
ModProg.pdfcsnotes
 
ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...
ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...
ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...מורן אלקובי
 
מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017
מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017
מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017Igor Kleiner
 
Angular 2 - Typescript
Angular 2  - TypescriptAngular 2  - Typescript
Angular 2 - TypescriptNathan Krasney
 

Similar to בדרך לפולימורפיזם - העמסת ועקיפת פונקציות (16)

בדרך לפולימורפיזם - Using Virtual/Pure Virtual
בדרך לפולימורפיזם - Using Virtual/Pure Virtualבדרך לפולימורפיזם - Using Virtual/Pure Virtual
בדרך לפולימורפיזם - Using Virtual/Pure Virtual
 
הורשה והיררכיה של מחלקות
הורשה והיררכיה של מחלקותהורשה והיררכיה של מחלקות
הורשה והיררכיה של מחלקות
 
תכנות מונחה עצמים - מחלקות
תכנות מונחה עצמים - מחלקותתכנות מונחה עצמים - מחלקות
תכנות מונחה עצמים - מחלקות
 
javascript
javascriptjavascript
javascript
 
לימוד תיכנות תיאורי (Descriptive Programming) ב-QTP
לימוד תיכנות תיאורי (Descriptive Programming) ב-QTPלימוד תיכנות תיאורי (Descriptive Programming) ב-QTP
לימוד תיכנות תיאורי (Descriptive Programming) ב-QTP
 
Java - OOP - Exceptions Handling
Java - OOP - Exceptions HandlingJava - OOP - Exceptions Handling
Java - OOP - Exceptions Handling
 
ActionScript 3.0-מדריך בסיסי ל
ActionScript 3.0-מדריך בסיסי לActionScript 3.0-מדריך בסיסי ל
ActionScript 3.0-מדריך בסיסי ל
 
C# .net lecture 2 Objects 2
C# .net lecture 2 Objects 2C# .net lecture 2 Objects 2
C# .net lecture 2 Objects 2
 
Selenium WebDriver
Selenium WebDriverSelenium WebDriver
Selenium WebDriver
 
C# .net lecture 1 in Hebrew
C# .net lecture 1 in HebrewC# .net lecture 1 in Hebrew
C# .net lecture 1 in Hebrew
 
תכנות מדעי: פייתון: הרצאה 10: : תחום הכרעה
תכנות מדעי: פייתון: הרצאה 10: : תחום הכרעהתכנות מדעי: פייתון: הרצאה 10: : תחום הכרעה
תכנות מדעי: פייתון: הרצאה 10: : תחום הכרעה
 
ModProg.pdf
ModProg.pdfModProg.pdf
ModProg.pdf
 
ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...
ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...
ג'אווה - תכנות מונחה עצמים - מתודות - שליפה והכנסה, סטטיות, סופיות ומתודות שע...
 
react-he.pdf
react-he.pdfreact-he.pdf
react-he.pdf
 
מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017
מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017
מבוא לתכנות מדעי: פייתון: הרצאה 5: 2017
 
Angular 2 - Typescript
Angular 2  - TypescriptAngular 2  - Typescript
Angular 2 - Typescript
 

More from מורן אלקובי

ג'אווה - תכנות מונחה עצמים - רב צורתיות
ג'אווה - תכנות מונחה עצמים - רב צורתיותג'אווה - תכנות מונחה עצמים - רב צורתיות
ג'אווה - תכנות מונחה עצמים - רב צורתיותמורן אלקובי
 
ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיות
ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיותג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיות
ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיותמורן אלקובי
 
ג'אווה - תכנות מונחה עצמים - הורשה
ג'אווה - תכנות מונחה עצמים - הורשהג'אווה - תכנות מונחה עצמים - הורשה
ג'אווה - תכנות מונחה עצמים - הורשהמורן אלקובי
 
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפהג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפהמורן אלקובי
 
SQL - מודל ישויות קשרים
SQL - מודל ישויות קשריםSQL - מודל ישויות קשרים
SQL - מודל ישויות קשריםמורן אלקובי
 
כלים מתמטיים - הוכחות משפטים
כלים מתמטיים - הוכחות משפטיםכלים מתמטיים - הוכחות משפטים
כלים מתמטיים - הוכחות משפטיםמורן אלקובי
 
עבודה עם קבצים בשפת סי
עבודה עם קבצים בשפת סיעבודה עם קבצים בשפת סי
עבודה עם קבצים בשפת סימורן אלקובי
 
מצגת בלוגיקה למדעי המחשב
מצגת בלוגיקה למדעי המחשבמצגת בלוגיקה למדעי המחשב
מצגת בלוגיקה למדעי המחשבמורן אלקובי
 
מתמטיקה דיסקרטית - תורת הקבוצות - פעולות
מתמטיקה דיסקרטית - תורת הקבוצות - פעולותמתמטיקה דיסקרטית - תורת הקבוצות - פעולות
מתמטיקה דיסקרטית - תורת הקבוצות - פעולותמורן אלקובי
 
מתמטיקה דיסקרטית - תורת הקבוצות - הגדרות
מתמטיקה דיסקרטית - תורת הקבוצות - הגדרותמתמטיקה דיסקרטית - תורת הקבוצות - הגדרות
מתמטיקה דיסקרטית - תורת הקבוצות - הגדרותמורן אלקובי
 
מתמטיקה דיסקרטית - קבוצות קשרים, דואליות
מתמטיקה דיסקרטית - קבוצות קשרים, דואליותמתמטיקה דיסקרטית - קבוצות קשרים, דואליות
מתמטיקה דיסקרטית - קבוצות קשרים, דואליותמורן אלקובי
 

More from מורן אלקובי (17)

ג'אווה - תכנות מונחה עצמים - רב צורתיות
ג'אווה - תכנות מונחה עצמים - רב צורתיותג'אווה - תכנות מונחה עצמים - רב צורתיות
ג'אווה - תכנות מונחה עצמים - רב צורתיות
 
ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיות
ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיותג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיות
ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיות
 
ג'אווה - תכנות מונחה עצמים - הורשה
ג'אווה - תכנות מונחה עצמים - הורשהג'אווה - תכנות מונחה עצמים - הורשה
ג'אווה - תכנות מונחה עצמים - הורשה
 
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפהג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
 
MySQL - מילון השאילתא
MySQL - מילון השאילתאMySQL - מילון השאילתא
MySQL - מילון השאילתא
 
SQL - מודל הנתונים
SQL - מודל הנתוניםSQL - מודל הנתונים
SQL - מודל הנתונים
 
SQL - אלגברה של יחסים
SQL - אלגברה של יחסיםSQL - אלגברה של יחסים
SQL - אלגברה של יחסים
 
SQL - מודל ישויות קשרים
SQL - מודל ישויות קשריםSQL - מודל ישויות קשרים
SQL - מודל ישויות קשרים
 
MySQL - מרכיבי השאילתא
MySQL - מרכיבי השאילתאMySQL - מרכיבי השאילתא
MySQL - מרכיבי השאילתא
 
טורי חזקה
טורי חזקהטורי חזקה
טורי חזקה
 
כלים מתמטיים - הוכחות משפטים
כלים מתמטיים - הוכחות משפטיםכלים מתמטיים - הוכחות משפטים
כלים מתמטיים - הוכחות משפטים
 
DLL מדריך לעבודה עם
DLL מדריך לעבודה עםDLL מדריך לעבודה עם
DLL מדריך לעבודה עם
 
עבודה עם קבצים בשפת סי
עבודה עם קבצים בשפת סיעבודה עם קבצים בשפת סי
עבודה עם קבצים בשפת סי
 
מצגת בלוגיקה למדעי המחשב
מצגת בלוגיקה למדעי המחשבמצגת בלוגיקה למדעי המחשב
מצגת בלוגיקה למדעי המחשב
 
מתמטיקה דיסקרטית - תורת הקבוצות - פעולות
מתמטיקה דיסקרטית - תורת הקבוצות - פעולותמתמטיקה דיסקרטית - תורת הקבוצות - פעולות
מתמטיקה דיסקרטית - תורת הקבוצות - פעולות
 
מתמטיקה דיסקרטית - תורת הקבוצות - הגדרות
מתמטיקה דיסקרטית - תורת הקבוצות - הגדרותמתמטיקה דיסקרטית - תורת הקבוצות - הגדרות
מתמטיקה דיסקרטית - תורת הקבוצות - הגדרות
 
מתמטיקה דיסקרטית - קבוצות קשרים, דואליות
מתמטיקה דיסקרטית - קבוצות קשרים, דואליותמתמטיקה דיסקרטית - קבוצות קשרים, דואליות
מתמטיקה דיסקרטית - קבוצות קשרים, דואליות
 

בדרך לפולימורפיזם - העמסת ועקיפת פונקציות

  • 1. ‫בדרך לפולימורפיזם – העמסת ועקיפת פונקציות‬ ‫בעולם התוכן של תכנות מונחה עצמים ושל כתיבת קוד בכלל קיימת שאיפה תמידית לכתוב קוד כמה שיותר‬ ‫פולימורפי – ג' נרי כך שנוכל להשתמש ביעילות ובחסכוניות באותן שורות קוד לביצוע פעולות בעלות אופי‬ ‫דומה, על פני שימוש חוזר, שכפול קוד והזזה של נתונים ממקום למקום שלא לצורך.‬ ‫פולימורפיזם, משמעותו, מצב בו קיימות מספר פונקציות שעל אף העובדה שהן חולקות את אותו השם,‬ ‫הן מבצעות פעולות שונות.‬ ‫ראשית, נעסוק בהבדלים בין העמסת פונקציות לעקיפת פונקציות בדרך לכתיבת קוד פולימורפי יותר.‬ ‫הגורם העיקרי המבדיל בין "העמסת" ל"עקיפת" פונקציות הוא מיקומן בהיררכיה המחלקתית.‬ ‫כפי שנהוג לציין בספרות, "העמסת פונקציה" נעשית בצורה אופקית, כלומר הקשר הוא בין פונקציות בעלות‬ ‫אותו שם הנמצאות באותה דרגה של הורשה בהיררכיה המחלקתית, כאשר ההבדל היחיד בינהן הוא מספר‬ ‫ו/או סוג הפרמטרים שהן מקבלות, בעוד "עקיפת פונקציה" נעשית בצורה אנכית, כלומר הקשר הוא בין‬ ‫פונקציות זהות לחלוטין הנמצאות ברמות שונות בהיררכיה המחלקתית, קרי, פועלות בקשר שבין‬ ‫ה – ‪ base class‬ל – ‪ ,derived class‬או אם תרצו, הקשר שבין האבא והבן ( או הבת :-) ).‬ ‫העמסת פונקציות‬ ‫היתרון הבולט ביותר בהעמסת פונקציות הוא היכולת להשתמש "באותה פונקציה" בדרכים שונות.‬ ‫נראה דוגמה:‬ ‫נניח וקיימת מחלקה בשם ‪ Robot‬ובמחלקה זו העמסנו את הפונקציה ‪ SetData‬באופן כזה שהיא יכולה לקבל‬ ‫פרמטר אחד, שני פרמטרים או לא לקבל פרמטרים בכלל:‬ ‫} ;‪void SetData( ) { cout << "You have not set any data..." << endl‬‬ ‫} ;‪void SetData ( int x ) { cout << "Data Recorded: " << x << endl‬‬ ‫} ;‪void SetData ( int x, int y ) { cout << "Data Recorded: " << x << " " << y << endl‬‬ ‫ונניח וקיים הרובוט 2‪ ,R2D‬אז נוכל לבצע הקריאות:‬ ‫;) (‪R2D2.SetData‬‬ ‫;)5(‪R2D2.SetData‬‬ ‫;)9,7(‪R2D2.SetData‬‬ ‫ולצפות לפלט הבא:‬ ‫...‪You have not set any data‬‬ ‫5 :‪Data Recorded‬‬ ‫9 7 :‪Data Recorded‬‬
  • 2. ‫ברצוני להציג דוגמה עקיפה לעניין זה. סוג של אנקדוטה קטנה, שאני מרגיש שיש צורך לעמוד על קיומה.‬ ‫נניח ו ‪ SetData‬הוא קונסטרקטור אשר ברצוננו "להעמיס" (שימו לב. אני בכוונה מציין את המרכאות על‬ ‫המושג להעמיס), כך שיקבל 2 פרמטרים, פרמטר יחיד או לא יקבל פרמטרים בכלל, אך בהיעדר הזנת אחד או‬ ‫יותר מהערכים, אנו נשתמש בערכי ברירת מחדל שהוגדרו מראש.‬ ‫ההצהרה על הקונסטרקטור תיעשה באופן הבא:‬ ‫;) 0=‪void SetData ( int=0, int=0, int‬‬ ‫ומימוש שלו ייראה כך:‬ ‫;} ... { ) ‪void SetData ( int x, int y, int z‬‬ ‫אם כן, לא באמת ביצענו העמסת פונקציה במקרה זה, הרי שיש לנו הצהרה אחת, ומימוש אחד עבור‬ ‫הקונסטרקטור שבדוגמה ואמרנו קודם, שבהעמסה, אנו נממש את הפונקציה מס' פעמים עם זהות בשם‬ ‫הפונקציה ושוני במספר הפרמטרים או סוגם.‬ ‫הסיבה שבגינה ציינתי דוגמה זו, היא צד המשתמש.‬ ‫עבור המשתמש, מדובר לכאורה בפונקציה שהועמסה, שהרי הוא יכול לקרוא לה עם שני פרמטרים, פרמטר‬ ‫בודד או ללא פרמטרים כלל. מעניין, נכון?‬
  • 3. ‫עקיפת פונקציות‬ ‫עבור עקיפת פונקציות, נציין את הגישה הישירה לביצוע העקיפה, ובמימושים מתקדמים יותר, נעסוק בהמשך.‬ ‫היתרון העיקרי בעקיפת פונקציות הוא היכולת "להגדיר מחדש" פונקציה שעברה בירושה מה– ‪Base Class‬‬ ‫כך שתישאר בעלת אותו השם ואותן התכונות, אך תבצע פעולה מותאמת אישית עבור היורש.‬ ‫נוכל לראות זאת בדוגמה הבאה:‬ ‫נניח וקיימת מחלקה בשם ‪ Robot‬ולה תתי מחלקות בשמות 2‪ R2D‬ו ‪.Optimus‬‬ ‫כשמריצים את הפונקציה ;) (‪ WhatAreYou‬על הרובוט ב- ‪ Base Class‬הוא עונה "אני רובוט אב", ומכאן שגם‬ ‫הבנים שלו ירשו את היכולת לענות תשובה זו, אך ברור לכל שהתשובה "אני רובוט בן" היא הנכונה עבורו.‬ ‫כמובן שיכולנו ליצור פונקציה נוספת בשם ;) (2‪ WhatAreYou‬למשל, בה יוכל הבן לומר מי הוא באמת, אך‬ ‫ברצוננו לשמור על המבנה הנוכחי מבלי להוסיף פונקציות מיותרות שרק יעמיסו על הקוד ועלולות לגרום‬ ‫לבלבול עקב האפשרות של הבן "לשקר" ולומר שהוא אב...‬ ‫על כן, עלינו לבצע "עקיפת פונקציה" על מנת להתאים אותה לצרכי הבן. אנו נבצע זאת על ידי שימוש בהגדרת‬ ‫פונקציה הזהה לחלוטין לזו של האב (הדבר אפשרי היות והפונקציות נמצאות ברמות היררכיה שונות), ובכך‬ ‫"לדרוס" את פונקצית האב באופן הבא:‬ ‫{ ‪class Robot‬‬ ‫}} ;‪void WhatAreYou( ) { cout << "I'm Robot, The father of all robots" << endl‬‬ ‫{ ‪class R2D2: public Robot‬‬ ‫}} ;‪void WhatAreYou( ) { cout << "I'm R2D2, The child of class Robot!" << endl‬‬ ‫{ ‪class Optimus: public Robot‬‬ ‫}} ;‪void WhatAreYou( ) { cout << "I'm Optimus, The child of class Robot!" << endl‬‬ ‫ובהנחה וקיימים הרובוטים ;1‪ ,Optimus robot3;, R2D2 robot2;, Robot robot‬נוכל לבצע את הקריאות‬ ‫הבאות:‬ ‫;) (‪robot1.WhatAreYou‬‬ ‫;) (‪robot2.WhatAreYou‬‬ ‫;) (‪robot3.WhatAreYou‬‬ ‫ולצפות לפלט הבא:‬ ‫!‪I'm Robot, The father of all robots‬‬ ‫!‪I'm R2D2, The child of class Robot‬‬ ‫!‪I'm Optimus, The child of class Robot‬‬