עצם מורכב
פעולה בונה מעתיקה
העמסת פעולות
הפניות לעצמים
c#:
public class Grade
{
private int grade;
private string subject;
public Grade(int grade, string subject)
{
this.grade = grade;
this.subject = subject;
}
public void SetGrade(int grade)
{
this.grade = grade;
}
public int GetGrade()
{
return grade;
}
}
public class Student{
private string id;
private Grade grade;
pubic Student (string id, Grade grade)
{
this.id = id;
this.grade = grade;
}
public Grade GetGrade()
{
return grade;
}
}
Main:
Grade grade = new Grade(100,”Math”);
Student s1 = new Student(“123456789”, grade);
Student s2 = new Student(“987654321”, grade);
מי הם התלמידים ומה הציון שלהם?
כרגע יש לנו תלמיד שתעודת הזהות שלו 123456789 והציון שלו במתמטיקה הוא 100, יש לנו תלמיד נוסף שתעודת הזהות שלו 987654321 והציון שלו במתמטיקה הוא 100.
המורה שבדק את המבחן של התלמיד 987654321, הבחין כי עשה טעות. והציון הנכון של אותו תלמיד הוא 85.
לכן המורה שינה את הציון של התלמיד 987654321.
s2.GetGrade().SetGrade(85);
כעבור כמה ימים, התלמיד 123456789 התלונן כי הציון שמופיע לו עבור מקצוע המתמטיקה הוא: 85.
תיקון הבעיה:
c#:
public class Grade
{
private int grade;
private string subject;
public Grade(int grade, string subject)
{
this.grade = grade;
this.subject = subject;
}
// copy constructor
public Grade(Grade o)
{
this.grade = o.grade;
this.subject = o.subject;
}
public void SetGrade(int grade)
{
this.grade = grade;
}
public int GetGrade()
{
return grade;
}
}
public class Student{
private string id;
private Grade grade;
pubic Student (string id, Grade grade)
{
this.id = id;
this.grade = new Grade(grade);
}
public Grade GetGrade()
{
return grade;
}
}
דוגמה להפניה לעצם:
Grade g1 = new Grade(90, “Sport”); //3000
Grade g2 = g1; // 3000
ב- g2 אנחנו שומרים את ההפנייה של g1.
אם היינו רוצים ליצור ציון זהה לציון של g1:
Grade g1 = new Grade(90, “Sport”); //3000
Grade g2 = new Grade(g1); //6000