דילוג לתוכן הראשי

אג' 6.11 ד' - ממשקים

בכיתה 
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 ניתן לפתור את הבעיה הזו.
    נגדיר "מרחב שמות" , שיעטוף את המחלקות, ויהיה חלק מהשם המלא של המחלקה.
    לדוגמה:
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();
    }
}
    המלה 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).
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();
    }
}
שיעורי בית
1. מלת-המפתח this בין בנאים
    קראו אודות השימוש ב- this בהקשר של מניעת קוד חוזר במקרה של מספר בנאים באותה המחלקה.
2. הפרויקט CarProject לתרגול הפעולה Equals
    א. בתחתית בלוק ה- Main (לאחר כל שורות הקוד שכבר קיימות בו מתרגילים קודמים) 
        צרו שתי מכוניות: cc1 ו- cc2 (באמצעות איזה בנאי שתרצו, ניתן לייצר כל מכונית באמצעות בנאי אחר).
    ב. הדפיסו את תוצאת ההשוואה בין הרכבים cc1 ו- cc2. את ההשוואה יש לעשות באמצעות הפעולה Eauqls
        הנמצאת במחלקת השורש (הבסיס) Object. התוצאה שתקבלו תהיה: false. מדוע?
    ג. מחקו את יצירת האובייקט cc2, ובמקום השורה שמחקתם, כתבו: ;Car cc2 = cc1.
    ד. הדפיסו את תוצאת ההשוואה בין הרכבים cc1 ו- cc2. התוצאה שתקבלו תהיה: true. מדוע?
    ה. כתבו פעולת override בשם Equals במחלקת Car שלכם. על הפעולה להחזיר true אם לשני הרכבים אותו 
        שם של יצרן. אחרת - false.
     ו. הריצו שוב את התכנית. ודאו שקיבלתם תוצאות נכונות.
3. Object.ReferenceEqual
    א. בצעו ב- Main השוואה בין cc1 ל- cc2 באמצעות Object.ReferenceEqual.
    ב. נמקו מדוע קיבלתם תוצאות שונות מאשר בהשוואות מסעיף 2.
4. קריאה - Namespace/Interface
    קראו את מה שנכתב בפוסט זה אודות שמות-מתחם ואודות interface.

בהצלחה.

בשיעור הבא
    6. הממשק IEnumerator

    7. הממשק IEnumerable

    8. הממשק IComparable עם הפעולה CompareTo