От процедурно към обектно-ориентирано
До 11. клас писахме „процедурно" — главен метод Main, който вика други методи, всичко с примитивни типове. Когато програмата стане по-голяма, имаме нужда да групираме данни и поведение, които вървят заедно.
Ключово
ООП = моделираме реалния свят чрез обекти. Всеки обект има състояние (данни) и поведение (методи).
Клас срещу обект
Класът е чертеж — описва каква структура и какви методи имат обектите от този тип. Обектът е конкретна инстанция със собствени стойности.
Първи клас в C#
class Student
{
public string Name;
public double Grade;
public void Greet()
{
Console.WriteLine($"Здравей, аз съм {Name}, оценка {Grade}.");
}
public bool IsExcellent()
{
return Grade >= 5.50;
}
}
class Program
{
static void Main()
{
Student ivan = new Student();
ivan.Name = "Иван";
ivan.Grade = 5.50;
ivan.Greet();
Console.WriteLine(ivan.IsExcellent()); // True
Student maria = new Student();
maria.Name = "Мария";
maria.Grade = 6.00;
maria.Greet();
}
}new Student() създава нов обект в паметта; връща препратка към него.
Конструктор
Винаги да правим ivan.Name = ... ред по ред е досадно (и можем да забравим). Конструкторът е специален метод, извикан при new:
class Student
{
public string Name;
public double Grade;
// Конструктор — име на класа, без тип-резултат
public Student(string name, double grade)
{
Name = name;
Grade = grade;
}
}
// Сега:
var ivan = new Student("Иван", 5.50);
var maria = new Student("Мария", 6.00);Няколко конструктора (overloading)
class Student
{
public string Name;
public double Grade;
public Student(string name) : this(name, 2.00) { } // оценка по подразбиране
public Student(string name, double grade)
{
Name = name;
Grade = grade;
}
}: this(name, 2.00) извиква другия конструктор — избягваме дублиране.
this — препратка към обекта
class Student
{
public string Name;
public Student(string Name)
{
this.Name = Name; // this.Name = полето; Name = параметърът
}
}Стойностни срещу референтни типове
Внимание
При int a = 5; int b = a; — двете променливи са независими копия. При обекти не е така!
Student s1 = new Student("Иван", 5);
Student s2 = s1; // s2 СОЧИ към същия обект!
s2.Grade = 6;
Console.WriteLine(s1.Grade); // 6 — променили сме общия обектЗа да получим истинско копие, ще трябва да направим нов обект и да копираме полетата ръчно (или да имплементираме clone).
Какво трябва да запомниш
- Клас = чертеж; обект = конкретна инстанция в паметта.
- Полета (данни) + методи (поведение) живеят заедно в класа.
- Конструктор се извиква при
new; може да има няколко (overload). thisпрепраща към текущия обект.- Обектите са референтни типове — присвояване не копира.