תכנות מונחה עצמים (OOP) - פולימורפיזם - הבסיס ל-Polymorphism

סגור באמצעות טופס זה תוכלו לספר ולהמליץ לחבריכם..
שם השולח:
כתובת דוא"ל של השולח:
שם המקבל:
שלח לכתובת דוא"ל:
הוסף הערה:
התכונה השלישית של שפה מונחית עצמים. היסוד המאפשר פולימורפיזם (Polymorphism) הוא המשפט הבא: ייחוס מטיפוס הבסיס יכול להתייחס (להצביע) לאובייקט מהמחלקה הנגזרת.


הבסיס לפולימורפיזם (Polymorphism)

 
 

מאת: ארז קלר


​הורדת דוגמאות קוד


היסוד המאפשר פולימורפיזם (Polymorphism) הוא המשפט הבא:
ייחוס מטיפוס הבסיס יכול להתייחס (להצביע) לאובייקט מהמחלקה הנגזרת.
 
לדוגמה:
 1  : class Base 
 2  : { 
 3  : 	. . . 
 4  : } 
 5  :  
 6  : class Derived:Base 
 7  : { 
 8  : 	. . . 
 9  : } 
 10 : class Program 
 11 : { 
 12 :       static void Main() 
 13 :       { 
 14 : 	       Base b = new Derived(); 
 15 : 	       . . . 
 16 :       } 
 17 : } 
הייחוס Base מקבל את הכתובת של האובייקט מהמחלקה Derived.
הייחוס מטיפוס הבסיס, שמצביע בפועל על אובייקט מטיפוס המחלקה הנגזרת יוכל להפעיל את המתודות של מחלקת הבסיס, אולם כל ניסיון להפעיל דרך הייחוס מטיפוס הבסיס מתודה של המחלקה הנגזרת יגרור שגיאת קומפילציה.
תקין b.BaseMethod(. . .);       
לא תקין b.DerivedMethod(. . .);
 
לדוגמה (PolymorphismSample01):
מחלקת הבסיס Person:

 1  : class Person 
 2  : { 
 3  :     private string firstName; 
 4  :     private string lastName; 
 5  :     public Person(string fn, string ln) 
 6  :     { 
 7  :         this.firstName = fn; 
 8  :         this.lastName = ln; 
 9  :     } 
 10 :     public void Print() 
 11 :     { 
 12 :         Console.WriteLine("Name={0} {1}", lastName, firstName); 
 13 :     } 
 14 : } 
המחלקה הנגזרת Employee:
 1  : class Employee : Person 
 2  : { 
 3  :     private float salPerHour; 
 4  :     private float workingHours; 
 5  :     public Employee(string fn, string ln, float sal, float hours) : base(fn, ln) 
 6  :     { 
 7  :         salPerHour = sal; 
 8  :         workingHours = hours; 
 9  :     } 
 10 :     public new void Print() 
 11 :     { 
 12 :         base.Print(); 
 13 :         Console.WriteLine("Salary = {0}", salPerHour * workingHours); 
 14 :     } 
 15 : } 
Main:
 1  : class Program 
 2  : { 
 3  :     static void Main(string[] args) 
 4  :     { 
 5  :         Person p = new Employee("Dutcha", "Foigel", 23.45f, 190); 
 6  :         p.Print(); 
 7  :  
 8  :     } 
 9  : } 
פלט:
פלט תוכנית הדוגמה PolymorphismSample01
    
כפי שהפלט מציג, הייחוס p הפעיל את המתודה ()Person.Print ולא את המתודה ()Employee.Print, כפי שאולי היינו מצפים.
 
סיכום ביניים:
בשלב זה לא ידוע לנו הרבה על מנגנון הפולימורפיזם אולם מה שידוע לא שימושי במיוחד (לפחות בינתיים):
ייחוס מטיפוס הבסיס יכול לקבל כתובת של אובייקט ממחלקה נגזרת, אולם אותו ייחוס יכיר רק את החברים (תכונות ומתודות) אשר מוגדרים במחלקת הבסיס.
 
בעיה רצינית שמעמידה בספק את שמישותה של הפולימורפיזם, נכון? .... לא נכון, בשביל זה יש מתודות וירטואליות.
 
 

כל הזכויות שמורות למחבר ©