יום שלישי, 12 במרץ 2013

מחלקות ועצמים -חלק 2


מחלקות ועצמים
מחלקה היא תבנית סגורה המכילה משתנים ופונקציות, אשר ניתן ליצור ממנה הרבה מופעים (אובייקטים/עצמים).
נהוג להתחיל שמות של מחלקות ושמות של פונקציות באות גדולה באנגלית ,למשל, Person.

נהוג להתחיל שמות של משתנים באות קטנה באנגלית ,למשל, firstName.

class Person
  {
   
//כל מה שנכתוב כאן שייך למחלקה
  }
כמו שאמרנו המחלקה היא למעשה התבנית שמכילה משתנים ופונקציות וממנה נוכל ליצור הרבה עצמים.
לדוגמה:
class Person

  {

    public string firstName;

    public string lastName;

    public int id;

  }
 על מנת ליצור את האיש יוסי למשל שהוא מכיל שם,שם משפחה, ות.ז נכתוב ככה:
Person y=new Person();
השתמשנו באות y על מנת לייצג את האובייקט יוסי
על מנת לגשת לתכונות של יוסי נשתמש בנקודה (.) ובסימן = על מנת לבצע השמה:
y.FirstName = "Yossi";

y.LastName = "Zamir";

y.Id = 1234578889;
קריאה מהמשתנים בשבעצם שיצרנו נעשה כך, לדוגמה בהדפסה:
Console.WriteLine("Name: {0} {1}", y.FirstName, y.LastName);
ההוראה תדפיס Yossi Zamir



אם נרצה לעשות פעולה שמשותפת לכל אישיות שיצרו בשבילה עצם נכתוב פעולה במחלקה, כפי שעשינו עם המשתנים. לדוגמה פעולה אשר מדפיסה את השם ושם משפחה של כל אישיות.
class Person

{

  public string firstName;

  public string lastName;

  public int id;

 

  public void Print()

  {

    Console.WriteLine("Full Name: {0} {1}", firstName, lastName);

  }

}

הפעלת הפעולה של העצם:
y.Print();

מחלקה מאפשרת לממש את עקרון הכימוס (encapsulation) - היכולת להסתיר אלמנטים הקיימים בתוך המחלקה, כך שרק לחברי המחלקה תהיה גישה אליהם.
זאת נעשה ע"י שימוש במילה השמורה private. כך יתאפשר לנו לקבוע אם חברי המחלקה יהיו ניתנים לכתיבה, קריאה, או כתיבה אך ורק באמצעות תנאי מסוים או לאחר פעולה מסוימת.
נהוג לעשות את כל המשתנים private ולאחר מכן לעשות פעולה שמאחזרת (Get) או פעולה שמעדכנת (Set) על מנת שגם נוכל לשלוט בערך שמאוחזר או מתעדכן בלי הצורך לשנות את כל התוכנית, אלא רק את המחלקה (התבנית) אותה יצרנו. גאוני לא?
class Person

{

  public string firstName;

  public string lastName;

  public int id;

 

  public void Print()

  {

    Console.WriteLine("Full Name: {0} {1}", firstName, lastName);

  }

}



לדוגמה:
class Person
    {
        private string firstName;
        private string lastName;
        private int id;
        //פעולות מאחזרות
        public string GetFirstName()
        {
            return this.firstName;
        }
        public string GetLastName()
        {
            return this.lastName;
        }
        public int GetID()
        {
            return this.id;
        }
        //פעולות מעדכנות
        public void SetName(string firstName)
        {
            this.firstName = firstName;
        }
        public void SetLastName(string lastName)
        {
            this.lastName = lastName;
        }
        public void SetID(int id)
        {
            this.id = id;
        }
 
        
        public void Print()
        {
            Console.WriteLine("Full Name: {0} {1}", firstName, lastName);
        }
    }
*כמו ששמתם לב השתמשנו במילה השמורה this, this אומר שאנו מתכוונים לעצם עצמו. בפעולות המעדכנות אנו מקבלים משתנה בשם של חברי המחלקה ולכן אנו חייבים להשתמש בthis על מנת שידעו בדיוק למה התכוונו ולמי אנחנו רוצים לבצע השמה.
 אנו נוהגים להשתמש בthis תמיד גם כאשר לא בהכרח צריך על מנת ליצור הרגל כתיבה נכון.

עכשיו על מנת לגשת לתכונות של עצם זה נעשה זאת אך ורק ע"י הפעולות המאחזרות והמעדכנות, גם כן ע"י נקודה, זו פעולה לכל דבר.
y.SetFirstName("Aviad");
וכעת לא נוכל לגשת למשתנים ע"י נקודה מיפני שהם private.
y.firstName="Aviad";                      privateלא תקין כעת, בעקבות ה
פעולה בונה
פעולה בונה נועדה לאתחל את כל המשתנים של העצם.
פעולה בונה תכתב עם גישת הרשאה Public ולאחר מכן שם המחלקה.
כך:
        public Person(string firstName,string lastName,int id)
        {
            this.firstName = firstName;
            this.lastName = lastName;
            this.id = id;
        }
כעת עם איתחול העצם נוכל להגדיר לו שם, שם משפחה ות.ז.
לדוגמה:
Person p=new Person("Aviad","Shiber",302935697);

פעולה בונה מעתיקה
פעולה בונה מעתיקה היא פעולה בונה הלוקחת עצם מאותו טיפוס ומעתיקה את המשתנים של העצם המעותק.
לדוגמה אם נרצה להעתיק את העצם אביעד שיבר, כי יש עוד עצם אביעד שיבר בעולם אך הוא עצם שונה לגמרי, ולכן לא נרצה להפנות לאותו עצם. לצורך העניין רק השם משפחה והשם פרטי שלו אותו דבר אך הת.ז שונה. אז נעתיק את העצם p שמכיל את הפרטים של אביעד שיבר, וניצור עצם חדש b שיעתיק את אותו אביעד שיבר אך נשנה לו את הת.ז
Person p=new Person("Aviad","Shiber",302935697);
Person b=new Person(p);
b.SetID("354887344");
כעת יש שני אביעד שיבר בעולם, אך הם עצמים שונים בעלי ת.ז שונות.
איך נכתוב פעולה בונה מעתיקה?
בדיוק כך:
public Person(Person person)
        {
            this.firstName = person.GetFirstName();
            this.lastName = person.GetLastName();
            this.id = person.GetID();
        }
מכיוון שאנו רוצים להעתיק בן אדם, הפעולה הבונה תקבל עצם מטיפוס Person.
ולאחר מכן תשים בעצם המאותחל כרגע את התוכנות מהעצם המתקבל.

תגובה 1:

  1. קוד מצוין
    אך ההסבר של למה אנו משתמשים בפעולה בונה מעתיקה
    לא מספיק מוסבר
    בעקרון זה פותר לנו בעיה של 2 הפניות לאותו עצם

    השבמחק