בכיתה
1. חזרה על מלת-המפתח is.
2. תרגול + הסבר העיקרון של מחלקה אבסטרקטית (מופשטת) ופעולה מופשטת.
3. הפרויקט AnimalsProject תרגיל שני
כאן (מופיע גם בדף 'קישורים' סעיף 220).
לבית
1. מכיוון שעבדתם כל כך טוב היום בכיתה, אני פוטר אתכם משיעורי בית ליום ד' הקרוב.
בשיעור הבא
1. Ctors with this
שימוש במלת המפתח this לייעול בנאי המחלקה ומניעת קוד כפול בהם.
2. Methods in class Object
פעולות public במחלקת השורש Object:
א. ToString
החזרת מחרוזת לתיאור האובייקט:
1. חזרה על מלת-המפתח is.
2. תרגול + הסבר העיקרון של מחלקה אבסטרקטית (מופשטת) ופעולה מופשטת.
3. הפרויקט AnimalsProject תרגיל שני
כאן (מופיע גם בדף 'קישורים' סעיף 220).
לבית
1. מכיוון שעבדתם כל כך טוב היום בכיתה, אני פוטר אתכם משיעורי בית ליום ד' הקרוב.
בשיעור הבא
1. Ctors with this
שימוש במלת המפתח this לייעול בנאי המחלקה ומניעת קוד כפול בהם.
2. Methods in class Object
פעולות public במחלקת השורש Object:
א. ToString
החזרת מחרוזת לתיאור האובייקט:
public virtual string ToString();
ב. GetHashCode
החזרת מספר ייחודי (כמו בתעודת-זהות) המייצג את האובייקט הספציפי.
הפעולה משמשת להכנסת אובייקטים למבנה מסוג Hash Table.
אם מגדירים מחדש את הפעולה Equals, יש להגדיר גם פעולה זו.
public virtual int GetHashCode();
ג. Equals
הפעולה מבצעת השוואה בין שני אובייקטים. כברירת-מחדל, הפעולה מבצעת
הפעולה מבצעת השוואה בין שני אובייקטים. כברירת-מחדל, הפעולה מבצעת
השוואה של ערכי ההתייחסות בלבד, כלומר מחזירה true אם המשתנים
מצביעים על אותו אובייקט.
public virtual bool Equals(object o);
ד. GetType
הפעולה מחזירה משתנה מסוג Type המכיל אינפורמציה לגבי
המחלקה של האובייקט.
המחלקה של האובייקט.
public virtual Type GetType();
3. Statics methods in class Object
פעולות public סטטיות במחלקת השורש Object:
א. object.ReferenceEqual
פעולה המשווה בין ערכי ההתייחסות (ייחוסים) של שני אובייקטים.
ב. object.Equals
פעולה המקבלת שני אובייקטים ומשווה ביניהם.
4. Namespace
בתכנית גדולה, יתכנו התנגשויות בין שמות מחלקות שונות שאנשים שונים בצוות מפתחים.
בעזרת namespace ניתן לפתור את הבעיה הזו.
נגדיר "מרחב שמות" , שיעטוף את המחלקות, ויהיה חלק מהשם המלא של המחלקה.
לדוגמה:
פעולות public סטטיות במחלקת השורש Object:
א. object.ReferenceEqual
פעולה המשווה בין ערכי ההתייחסות (ייחוסים) של שני אובייקטים.
ב. object.Equals
פעולה המקבלת שני אובייקטים ומשווה ביניהם.
4. Namespace
בתכנית גדולה, יתכנו התנגשויות בין שמות מחלקות שונות שאנשים שונים בצוות מפתחים.
בעזרת namespace ניתן לפתור את הבעיה הזו.
נגדיר "מרחב שמות" , שיעטוף את המחלקות, ויהיה חלק מהשם המלא של המחלקה.
לדוגמה:
using System;
namespace mySpace
{
class MyClass //namespace -מחלקה זו עטופה ב
{
}
}
class MainClass //like class Program, this name can be changed to any name.
{
public static void Main()
{
mySpace.MyClass myObj = new mySpace.MyClass();
}
}
using System;
using mySpace;
namespace mySpace
{
class MyClass
{
}
}
class MainClass
{
public static int Main()
{
MyClass myObj = new MyClass();
}
}
{
System.Console.WriteLine("Hello");
}
{
void Function1(int iValue);
int Function2();
}
namespace mySpace
{
class MyClass //namespace -מחלקה זו עטופה ב
{
}
}
class MainClass //like class Program, this name can be changed to any name.
{
public static void Main()
{
mySpace.MyClass myObj = new mySpace.MyClass();
}
}
using System;
using mySpace;
namespace mySpace
{
class MyClass
{
}
}
class MainClass
{
public static int Main()
{
MyClass myObj = new MyClass();
}
}
המלה using אומרת למהדר לחפש שמות של מחלקות/מבנים בתוך ה- namespace שצוין,
כשהוא בא לקמפל (להדר) את הקוד. אם ישנם כמה namespace עם מחלקה באותו שם,
עדיין לא תתעורר בעיה, כיוון שיהיה ניתן לפנות למחלקות השונות על-ידי השם המלא שלהן.
ניתן להגדיר namespace בתוך namespace. במקרה כזה, הגישה למחלקה פנימית תהיה
על-ידי רישום ה- namespace החיצוני והפנימי, ולאחריהם שם המחלקה, כשהם מופרדים
בנקודתיים ביניהם.
ניתן גם לתת שם נרדף לשמות namespace במקרים של קינון עמוק בתוך namespace אחרים.
using MyAlias = MyCompany.Proj.Nested; //define an alias to
להלן פעולה אשר "לא סומכת" על הגדרות ה- using:
public static void SayHello(){
System.Console.WriteLine("Hello");
}
5. Interface
Interface היא למעשה מחלקה אבסטרקטית, שבה לא מוגדרים משתנים (תכונות), וכל הפעולות בה הן
אבסטרקטיות.
מטרת ה- Interface הינה להגדיר התנהגות מסוימת, והוא משמש בסיס למחלקות המממשות התנהגות זו.
ההבדל בין Interface לבין מחלקה אבסטרקטית אשר כל הפעולות בה אבסטרקטיות, הוא שמחלקה יכולה
להיגזר ממספר Interface, אולם יכולה להיגזר ממחלקה בודדת בלבד.
הסיבה לכך היא שישנם שני סוגי הורשות:
* הורשה של התנהגות.
* הורשה של מימוש.
שפת ++C תומכת בהורשה מרובה של מימוש, לעומתה שפת #C תומכת בירושה יחידה של מימוש, ובירושה
מרובה של התנהגות.
הגדרת Interface
נעשית על-ידי המלה השמורה Interface. לדוגמה:
interface MyInterface{
void Function1(int iValue);
int Function2();
}
אנו מגדירים את הפעולות בתוך ה- Interface.
כל הפעולות הן public.
כל הפעולות מוגדרות באופן אוטומטי כ- virtual, ולכן אין צורך לרשת דבר, פרט לחתימה של הפעולה -
שמה, הפרמטרים שהיא מקבלת וטיפוס הערך המוחזר.
Interface יכול לקבל הרשאת-גישה public או internal (שמשמעותו שניתן להשתמש ב- Interface רק
באותו Assembly, ולא בכל Assembly).
כל הפעולות מוגדרות באופן אוטומטי כ- virtual, ולכן אין צורך לרשת דבר, פרט לחתימה של הפעולה -
שמה, הפרמטרים שהיא מקבלת וטיפוס הערך המוחזר.
Interface יכול לקבל הרשאת-גישה public או internal (שמשמעותו שניתן להשתמש ב- Interface רק
באותו Assembly, ולא בכל Assembly).
using System;
interface Aminal
{
void MakeSound();
}
class Dog : Aminal
{
public void MakeSound()
{
Console.WriteLine("Woof");
}
}
class Cat : Aminal
{
public void MakeSound()
{
Console.WriteLine("Myaow");
}
}
class Cow : Aminal
{
public void MakeSound()
{
Console.WriteLine("Muuuu");
}
}
public class MyClass
{
public static void Main()
{
Dog Dogi = new Dog();
Cat Shmil = new Cat();
Cow David = new Cow();
PrintMessage(Dogi);
PrintMessage(Shmil);
PrintMessage(David);
}
static void PrintMessage(Aminal aminal)
{
aminal.MakeSound();
}
}
PrintMessage(Shmil);
PrintMessage(David);
}
static void PrintMessage(Aminal aminal)
{
aminal.MakeSound();
}
}
6. הממשק IEnumerator
7. הממשק IEnumerable
8. הממשק IComparable עם הפעולה CompareTo