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

מדריך C# – תכנות מונחה עצמים: אוספים מותאמים וסדרנים (Indexers)

‏ • John Bryce

לעיתים נרצה לבנות Collection (אוסף) משלנו אשר יכיל בתוכו אובייקטים מסוג שאנו נבנה ויספק לנו את הפונקציונאליות הקשורה לאובייקטים שלנו. ישנם הרבה דרכים ליצור Custom collection, החלק מלבנות מאפס ועד לרשת מ- Collection קיים, לכל שיטה היתרונות והחסרונות שלה. לצורך ההבנה של הדברים בצורה מיטבית נתמקד בשיטה של לעטוף Collection קיים.

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

מכיוון שאנו בונים מחלקה ישנה בעיה בגישה אליה באמצעות סוגריים מרובעים [ ] מכיוון שניתן לגשת רק למערכים באמצעות סוגריים מרובעים. לכן במחלקת ה- collection שלנו נבנה property מיוחד שנקרא indexer (סדרן) המאפשר גישה באמצעות [ ].

להלן דוגמא מלאה ל- Custom Collection עבור המחלקות שבנינו בפרק הפולימורפיזם, כולל מימוש indexer ושימוש ב- Collection:

 

using System.Collections;

namespace CustomCollections
{
  class PersonCollection : IEnumerable
  {
    //Fields:
    private ArrayList pArr;

    //C'tors:
    public PersonCollection()
    {
      pArr = new ArrayList();
    }

    //Properties:
    public int Count
    {
      get
      {
        return pArr.Count;
      }
    }

    //Indexers:

    public Person this[int idx]
    {
      get
      {
        return (Person)pArr[idx];
      }
      set
      {
        pArr[idx] = value;
      }
    }

    public Person this[string fName]
    {
      get
      {
        for (int i = 0; i < Count; i++)
          if (this[i].FirstName == fName)
            return this[i]; //return the Person

        return null//Person not Found!
      }
    }

    //Methods:

    public void Add(Person newPerson)
    {
      pArr.Add(newPerson);
    }

    public void Remove(Person p)
    {
      pArr.Remove(p);
    }

    public void RemoveAt(int idx)
    {
      pArr.RemoveAt(idx);
    }

    public string PrintAll()
    {
      string str = "";

      for (int i = 0; i < Count; i++)
      {
        //str+=((Person)pArr[i]).Print();
        //Same as:
        str += this[i].Print() + "\n";
      }

      return str;
    }

    public double GetSumSalary()
    {
      double sum = 0;

      for (int i = 0; i < Count; i++)
      {
        if (this[i] is Employee)
          sum += ((Employee)this[i]).Salary;
      }

      return sum;
    }


    #region IEnumerable Members

    public IEnumerator GetEnumerator()
    {
      return pArr.GetEnumerator();
    }

    #endregion
  }
}

 

using System;

namespace CustomCollections
{
  class Program
  {
    static void Main(string[] args)
    {
      PersonCollection pcol = new PersonCollection()
      {
        new Person("A","AA"),
        new Employee("B", "BB",10000),
        new Student("C", "CC",new int[]{80,100,90}),
        new Person("D", "DD"),
        new Manager("E", "EE",20000,5000)
      };

      //using indexer (set):
      pcol[3] = new Person("Lior", "Zamir");

      //using indexer (get):
      Console.WriteLine("** The fourth person:"
                        + pcol["Lior"].Print());

      Console.WriteLine("\n** Printing all persons:\n"
                        + pcol.PrintAll());

      Console.WriteLine("\n** Sum Salary (Employees only):\n"
                        + pcol.GetSumSalary());
    }
  }
}

 

פלט התוכנית:

indexers - פלט

תגיות: , ,

ליאור זמיר

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

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