196. Operator overloading

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

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

ניתן לעשות זאת באמצעות משהו שנקרא Operator overload. מה זה? מדובר בעצם פונקציה סטטית שתפעל ברגע שיפעילו את האופרטור שלנו.

למשל, נניח שיש לנו מחלקה המייצגת מטריצה 5x5:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Matrix5x5
{
public Matrix5x5 Multiply(Matrix5x5 other)
{
// ...
}
public Matrix5x5 Multiply(double scalar)
{
// ...
}
public Matrix5x5 Add(Matrix5x5 other)
{
// ...
}
public Matrix5x5 Negate()
{
// ...
}
}

נוכל ליצור אופרטורים מתאימים בצורה הבאה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static Matrix5x5 operator +(Matrix5x5 first, Matrix5x5 second)
{
return (first.Add(second));
}
public static Matrix5x5 operator *(Matrix5x5 first, Matrix5x5 second)
{
return (first.Multiply(second));
}
public static Matrix5x5 operator -(Matrix5x5 first, Matrix5x5 second)
{
return (first.Add(second.Negate()));
}
public static Matrix5x5 operator -(Matrix5x5 matrix)
{
return matrix.Negate();
}

בסה"כ מדובר בפונקציות סטטיות שמבצעות את הקריאות הנכונות.

מה שכן, האופרטורים יכולים לעבוד גם אם אחד האיברים הוא לא איבר של המחלקה שלנו:

למשל, הכפלת מטריצה בקבוע:

1
2
3
4
public static Matrix5x5 operator *(double scalar, Matrix5x5 matrix)
{
return matrix.Multiply(scalar);
}

זהו, ככה אפשר להשתמש בפונקציות האלה בצורה יותר נוחה:

1
2
3
4
Matrix5x5 firstMatrix;
Matrix5x5 secondMatrix;
Matrix5x5 result = firstMatrix + secondMatrix;
Matrix5x5 multipliedByScalar = 9 * firstMatrix;

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

יש לזה חסרון שהוא לא מובן ממבט ראשון – אי אפשר ליצור Operator Overload לממשקים, או בכלל להכריח ממשק שיהיה לו אופרטור כזה (למשל, היינו רוצים שלממשק שמייצג מספר כלשהו, יהיה גם אופרטור חיבור).

שבוע עם אופרטור טוב

שתף