Web Servicesblog.csit.org.il/UpLoad/FilesUpload/OperatorOverloading... · 2017. 6. 18. ·...
Transcript of Web Servicesblog.csit.org.il/UpLoad/FilesUpload/OperatorOverloading... · 2017. 6. 18. ·...
העמסת אופרטורים
ארז קלר: ליווי מקצועי
www.corner.co.il
Web Services
.מבוא•
.העמסת אופרטורים לוגיים•
.העמסת אופרטורים מתמטיים•
.העמסת אופרטורי המרה•
.העמסת אופרטורים אונריים•
מבוא
:הפעולות הבאות ברורת מאליהן
int num1 = 12;
int num2 = 23;
int num3 = num1+num2;
if(num1 == num2)
num3 +=5;
:הפעולות הבאות יעוררו תמיההDate d1 = new Date(...)
Date d2 = new Date(...)
Date d3 = d1-d2;
if(d1 == d2)
d3 += 5;
מבוא
, פעילות אריתמטית לוגית על משתנים פשוטים היא דבר ברור•
הכיצד ידע האופרטור , פעילות זו על אובייקטים מעוררת תמיהה
?כיצד לבצע את פעולתו
או על פי אילו שדות לבצע ?, הכיצד ידע לאיזה שדה להוסיף ערך•
?השוואה
, כברירת מחדל האופרטורים אינם יודעים כיצד לפעול עם אובייקטים•
.אותם" ללמד"מסוגלת ( C++כמו שפת ) C#אולם
בהעמסה יש להקפיד על מספר כללים
נעמיס אופרטור רק במידה ויש משמעות ברורה מאליה •
.להעמסה
.נקפיד לשמור על כל המשמעויות המקוריות שלהאופרטור•
מבוא
.כל המתודות המעמיסות אופרטורים הן סטאטיות•
.מספר הפרמטרים שהמתודות מקבלות הוא כמספר האופרנדים•
ולאחריה שם operatorשם המתודה מתחיל במילה השמורה •
.האופרטור המועמס
+:העמסה של האופרטור , לדוגמה •
public static Time operator+(Time t1, Time t2)
{
int newHours = t1.hours + t2.hours;
int newMinutes = t1.minutes + t2.minutes;
return new Time(newHours, newMinutes);
}
מבוא
האופרטורים הניתנים להעמסה•unary operators
+, -, !, ~, ++, --, true, false
•binary operators
+, -, *, /, %, &, |, ^, <<, >>
•comparison operators
==, !=, <, >, <=, >=
:אולם הם חייבים להיות מועמסים בזוגות
.< =עם > => , עם , < =! עם ==
מבוא
האופרטורים שאינם ניתנים להעמסה
+=, -=, *=, /=, %=, &=, |=, ^=, <<=,
>>=
= ,.? ,: ,- ,>new, is, sizeof,
typeof, &&, ||
מבוא
המטרה בהעמסת אופרטורים היא לשפר את
הקריאות של הקוד ובכך להימנע משגיאות
.וטעויות :לדוגמה
ללא אופרטורים
myIntVar1 = Int.Add(myIntVar2,
Int.Add(Int.Add(myIntVar3,
myIntVar4), 33));
: עם אופרטורים
myIntVar1 = myIntVar2 + myIntVar3 + myIntVar4 + 33;
.מבוא•
.העמסת אופרטורים לוגיים•
.העמסת אופרטורים מתמטיים•
.העמסת אופרטורי המרה•
.העמסת אופרטורים אונריים•
העמסת אופרטורים לוגיים
Relational Operators
:מחייבים העמסה בזוגות
< and >
<= and >=
== and !=
Equalsיש לדרוס את המתודות =! -ו== בהעמסת האופרטורים •
. GetHashCodeואת
העמסת אופרטורים לוגיים
לדוגמהclass Circle
{
public static bool operator==( Circle c1,Circle c2)
{
return c1.Equals(c2);
}
. . .
}
:שימוש
If(c1 == c2)
{
. . .
}
העמסת אופרטורים לוגיים
class Circle לדוגמה
{
public static bool operator!=(Circle c1,Circle c2)
{
if (c1.x != c2.x || c1.y != c2.y || c1.radius != c2.radius)
return true;
return false;
}
. . .
}
:שימוש
If(c1 != c2)
{
. . .
}
.מבוא•
.העמסת אופרטורים לוגיים•
.העמסת אופרטורים מתמטיים•
.העמסת אופרטורי המרה•
.העמסת אופרטורים אונריים•
העמסת אופרטורים מתמטיים
/ :, * , -, + ניתן להעמיס את האופרטורים :לדוגמה
class Circle
{
public static Circle operator+(Circle c1,Circle c2)
{
Circle c = new Circle();
c.x = c1.x + c2.x;
c.y = c1.y + c2.y;
c.radius = c1.radius + c2.radius;
return c;
}
}
העמסת אופרטורים מתמטיים
/ :, * , -, + ניתן להעמיס את האופרטורים :לדוגמה
class Circle
{
. . .
public static Circle operator-(Circle c1,Circle c2)
{
Circle c = new Circle(c1.x - c2.x, c1.y - c2.y, c1.radius - c2.radius);
return c;
}
}
.מבוא•
.העמסת אופרטורים לוגיים•
.העמסת אופרטורים מתמטיים•
.העמסת אופרטורי המרה•
.העמסת אופרטורים אונריים•
העמסת אופרטורי המרה
•C# מאפשרת להגדיר שיטות העמסה מאוד
. User Defined Conversionsמיוחדות המכונות
( Casting)שיטות אלו מאפשרות לבצע המרה •
או מרומז ( Explicit)מטיפוס לטיפוס באופן מפורש
(Implicit )על פי הגדרתנו.
העמסת אופרטורי המרה
:לדוגמהclass Person
{ ...
public static implicit operator string (Person p)
{
string str;
str = p.name + " " + p.age;
return str;
}
}
Person -המרה מ
String -ל
העמסת אופרטורי המרה
:לדוגמה
class Person
{ ...
public static explicit operator Person (string str)
{
Person p = new Person();
string []tmp = new string [2];
tmp = str.Split(char.Parse(" "));
p.name = tmp[0];
p.age = int.Parse(tmp[1]);
return p;
}
}
-ל String -המרה מ
Person
העמסת אופרטורי המרה
: Implicit -השימוש בהמרה מרומזת, דוגמה
class App
{
static void Main(string[] args)
{
Person p1 = new Person("Moshe",12);
Console.WriteLine(p1);
Person p2 = new Person();
. . .
}
}
העמסת אופרטורי המרה
: Explicit -השימוש ב, דוגמה
class App
{
static void Main(string[] args)
{
Person p2 = new Person();
string str = "Shoshana 12";
p2 = (Person)str;
Console.WriteLine(p2);
}
}
.מבוא•
.העמסת אופרטורים לוגיים•
.העמסת אופרטורים מתמטיים•
.העמסת אופרטורי המרה•
.העמסת אופרטורים אונריים•
העמסת אופרטורים אונריים
אופרטורים אונאריים הינם אופרטורים בעלי
--האופרטור , ++האופרטור : כגון, אופרנד יחיד
'וכו
class Circle
{
public static Circle operator++(Circle c)
{
c.radius = c.radius + 1;
return c;
}
}
העמסת אופרטורים אונריים
חייבים להיות ממומשים ) false -ו trueהאופרטורים
class Circle (:ביחד
{
public static bool operator true(Circle c)
{
if (c.x > 0 || c.x < 100 || c.y > 0 || c.y < 100)
return true;
return false;
}
public static bool operator false(Circle c)
{ . . . }
}
העמסת אופרטורים אונריים
:דוגמה
Circle c = new Circle(1,2,12);
if (c)
Console.WriteLine("Legal");
else
Console.WriteLine("Illegal");
הפעלת האופרטור
true
העמסת אופרטורים
.מבוא1.
.העמסת אופרטורים לוגיים2.
.העמסת אופרטורים מתמטיים3.
.העמסת אופרטורי המרה4.
.העמסת אופרטורים אונריים5.
.ארז קלר: עריכה מקצועית
www.corner.co.il