Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 1 · Урок 11

ООП — класове и обекти

Какво е обектно-ориентирано програмиране, как се дефинира клас, какво е обект, конструктори и инстанциране.

От процедурно към обектно-ориентирано

До 11. клас писахме „процедурно" — главен метод Main, който вика други методи, всичко с примитивни типове. Когато програмата стане по-голяма, имаме нужда да групираме данни и поведение, които вървят заедно.

Ключово

ООП = моделираме реалния свят чрез обекти. Всеки обект има състояние (данни) и поведение (методи).

Клас срещу обект

Класът е чертеж — описва каква структура и какви методи имат обектите от този тип. Обектът е конкретна инстанция със собствени стойности.

Класът Student+ Name: string+ Grade: double+ Greet()+ IsExcellent()шаблон(чертеж)ivanName = "Иван"Grade = 5.50обектmariaName = "Мария"Grade = 6.00обектконкретни инстанции с реални стойности
Фиг. 1 — Класът Student описва структурата; обектите ivan и maria са реални копия с различни данни

Първи клас в 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 препраща към текущия обект.
  • Обектите са референтни типове — присвояване не копира.