מדריך C# מונחה עצמים

מדריך C# – תכנות מונחה עצמים: ממשקים – Interfaces

‏ • John Bryce

interface (ממשק) הינו מבנה לוגי מופשט (אבסטרקטי) המכיל רק הצהרות.

אחד מתפקידי ה- interface העיקריים הוא ליצור ממשק זהה לאובייקטים שונים (אפילו בהיררכיות שונות) ובכך הוא אחד היישומים של עיקרון הפולימורפיזם בתכנות מונחה העצמים (OOP).

 

דוגמא ל- interface:

  interface IPrint
  {
    string Print();
  }

דגשים חשובים לגבי interface

  • אינו יכול להכיל משתנים או מימושים (פונקציות עם תוכן) אלא רק הצהרות. המחלקות/מבנים שירשו את ה- interface הם אלה שיממשו את ההצהרות.
  • כאשר נממש (נירש) interface חובה לממש את כל ההצהרות שבו
  • ניתן לרשת רק מחלקה אחת ובנוסף ניתן לרשת ולממש מספר בלתי מוגבל של interfaces
  • לא ניתן ליצור אובייקט מ- interface אלא רק ייחוס (reference)
  • גם struct יכול לרשת מ- interface
  • נהוג ששם של interface יתחיל באות I

 

דוגמא למימוש interface:

  class Person : IPrint
  {
    public string Print()
    {
      return "Hello";
    }
  }

דוגמא לשימוש ב- interface:

   IPrint p = new Person();
   Console.WriteLine(p.Print());

Interface הינו למעשה חוזה בין מחלקות המאפשר למתכנת לבנות תבנית ולבנות שירות המבוסס על תבנית זו וכל אחד שיממש את התבנית יוכל להשתמש בשירות זה.

בסביבת ה- NET. יש מספר רב של interface המאפשרים להשתמש בשירותים שונים הקיימים בסביבה. להלן דוגמא לכמה מהם:

  • IComparable
  • IComparer
  • IEnumerable
  • IEnumerator

ניקח כדוגמא את הממשק IComparable המספק פונקציה אחת להשוואה בין אובייקטים:

  public interface IComparable
  {
    int CompareTo(object obj);
  }

להלן התיעוד של הפונקציה CompareTo המסביר מה צריך להיות הערך החוזר:

//The return value has these meanings:
//Value Meaning Less than zero This instance is less than obj.
//Zero This instance is equal to obj.
//Greater than zero This instance is greater than obj.

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

לדוגמא נבנה מחלקה Person ונבצע את ההשוואה לפי הגיל:

 

  public class Person : IComparable
  {
    public int Age { get; set; }

    public string Print()
    {
      return string.Format("Age: {0}", Age);
    }

    public int CompareTo(object obj)
    {
      Person p = (Person)obj;

      if (Age < p.Age)
        return -1;

      if (Age > p.Age)
        return 1;

      return 0;
    }
  }

עכשיו ניתן להשתמש בשירות Sort הקיים במחלקה Array אשר משתמש ב- interface כדי לבצע את ההשוואה:

 

 class Program
  {
    static void Main(string[] args)
    {
      Person[] persons = new Person[]
      {
        new Person() { Age = 25 },
        new Person() { Age = 17 },
        new Person() { Age = 30 }
      };

      Console.WriteLine("Before Sorting:");
      foreach (Person p in persons)
        Console.WriteLine(p.Print());

      Array.Sort(persons);

      Console.WriteLine("\nAfter Sorting:");
      foreach (Person p in persons)
        Console.WriteLine(p.Print());
    }
  }

 

בפלט ניתן לראות את מצב המערך לפני ואחרי המיון:

 

Interfaces - פלט לפני ואחרי המיון

תגיות: , ,

ליאור זמיר

כיום אני ה- Webmaster של תוכנית החדשנות של HPE Software.לפני כן, הייתי מנהל תחום Webmaster ומרצה בכיר בג'ון-ברייס (במשך 9 שנים) בקורסים לפיתוח ותיכנות באמצעות Microsoft .NET, מולטימדיה, בניית אתרי אינטרנט ואינטראנט. פיתוח הדרכה ומתן ייעוץ טכנולוגי.

תגובות בפייסבוק