כיצד לעבוד עם עומס יתר של המפעיל ב- C #

פולימורפיזם הוא אחד מעקרונות היסוד של OOP (Object Oriented Programming). המילה פולימורפיזם נגזרת משתי מילים - "פולי" שמשמעותן רבות, ו"מורף "שמשמעותו צורות. מכאן שפולימורפיזם מרמז על קיומו של אותו דבר אך בצורות שונות.

עומס יתר על המפעיל הוא דוגמה לפולימורפיזם סטטי. באפשרותך למנף עומס יתר של מפעילים או להוסיף פונקציונליות למפעילים כדי לעבוד עם סוגים מוגדרים על ידי המשתמש באותה צורה בה אתה עובד עם סוגי נתונים בסיסיים.

מהם המפעילים ומהם המפעילים שניתן להעמיס עליהם?

בביטוי בדרך כלל יש לך אופרטורים ואופרים. מפעילים הם כאלה שעובדים על אופרנדים וכולם הם חלק מהבעה. כדוגמה להלן ביטוי המכיל שני אופרנדים ומפעיל אחד. האופרנדים הם X ו- Y והמפעיל הוא +.

X + Y

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

ניתן להעמיס על המפעילים האונרים כלומר, על מפעילים שעובדים עם אופרנד אחד. ניתן גם להעמיס על אופרטורים בינאריים ומפעילי השוואה כמו, ==,! =,, =. עם זאת, אינך יכול להעמיס על אופרטורים =,?, ->, new, is, sizeof או typeof. אינך יכול גם להעמיס על המפעילים המותנים כמו && ו || בְּקַלוּת. כמו כן, לא ניתן להעמיס על מפעיל אינדקס המערך [].

תוכל ללמוד עוד על מה ניתן להעמיס על כל המפעילים מתוך מאמר MSDN זה.

יישום עומס יתר של מפעיל ב- C #

בחלק זה נחקור כיצד אנו יכולים ליישם עומס יתר של המפעיל ב- C #. שקול את הכיתה הבאה בשם DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

עיין ברישום הקוד לעיל. הכיתה DistanceCalculator מכילה שני חברי נתונים מסוג Int32, כלומר רגליים ואינץ '. כעת הוספנו שיטות נוספות למחלקה זו כדי להמחיש כיצד ניתן להעמיס על מפעילים.

כאשר אתה עובד עם עומס יתר על המפעיל, עליך לזכור נקודות מסוימות. למפעיל שיש להעמיס עליו תהיה שיטה מתאימה המסומנת במפעיל מילות המפתח. הטיעונים לפונקציית המפעיל הם אופרנדים ופונקציית המפעיל שלך יכולה להחזיר ערך. פונקציית המפעיל צריכה להיות סטטית והיא צריכה להיות חברה מהסוג המכיל.

קטע הקוד הבא ממחיש כיצד תיראה פונקציית אופרטור אופיינית. דוגמה זו מראה כיצד ניתן להעמיס על המפעילים == ו-! =.

public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

שימו לב שערך הוא מאפיין שמחזיר את הערך במונחים של אינץ '.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

הנה רשימת הקוד המלאה של הכיתה DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

       public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

       public override bool Equals(object obj)

       {

           DistanceCalculator distanceCalculator = obj as DistanceCalculator;

           if (distanceCalculator != null)

           {

               return (distanceCalculator == this);

           }

           return false;

       }

       public override int GetHashCode()

       {

           return Value.GetHashCode();

       }

     public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

       public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

   }

קטע הקוד הבא ממחיש כיצד ניתן להשתמש במחלקה DistanceCalculator.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 2);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           Console.WriteLine((obj1 == obj2).ToString());

           Console.Read();

       }

קטע הקוד הבא מראה כיצד ניתן להעמיס על המפעיל + כדי להוסיף שני אובייקטים.

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           Int32 totalInches = obj1.Value + obj2.Value;

           Int32 feet = totalInches / 12;

           Int32 inch = totalInches % 12;

           DistanceCalculator temp = new DistanceCalculator(feet, inch);

           return temp;

       }

בואו להוסיף את שני המאפיינים הבאים למחלקה DistanceCalculator. קטע הקוד הבא מראה כיצד ניתן להוסיף שני אובייקטים מסוג DistanceCalculator ולהחזיר את האובייקט שהתקבל כאותו סוג, כלומר האובייקט שהוחזר הוא מסוג DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

כך תוכל ליצור שני מופעים של מחלקת DistanceCalculator ולנצל את פונקציית המפעיל העמוסה כדי להקצות את התוצאה לאובייקט אחר מאותו סוג.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 11);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           DistanceCalculator obj3 = obj1 + obj2;

           Console.WriteLine("Feet: "+obj3.Feet.ToString());

           Console.WriteLine("Inch: " + obj3.Inch.ToString());

           Console.Read();

       }