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

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

Класове

Синтаксисът на дефиниране на клас в C#, ролята на public, конструкторът по премълчаване и достъпът до атрибутите с точка. Класовете Car и Student.

Защо ни е това

В предишния урок видя какво е обект и клас. Сега идва как се записва това в C# — синтаксисът, ключовите думи и какво прави компилаторът вместо теб.

Ключово

От гледна точка на класическото програмиране дефинирането на клас е дефиниране на нов потребителски тип данни. Обектите на класа — инстанциите — са аналог на променливите от съответния тип.

Дефиниране на клас

public class <име на класа>
{
    // атрибути
    ...
    // методи
    ...
}

Например класът, който описва автомобил:

public class Car
{
    // атрибути
    public string brand;
    public string model;
    public int engineVolume;
    public int yearProd;
}
  • Ключовата дума public пред класа означава, че определяният тип е за всеобща употреба и може да бъде използван в програми като всеки друг тип.
  • Тялото на декларацията са редовете между двете къдрави скоби.
  • public пред всеки атрибут означава, че той е публичен — достъпен за използване и променяне в програмата.

Конструкторът, който идва наготово

Така създаденият клас още няма явно дефинирани методи. Но всеки новосъздаден клас включва по премълчаване метод, наричан вграден конструктор — той носи името на класа и няма аргументи. В примера това е функцията Car().

Наличието на този конструктор прави класа функционален: можем да създаваме негови инстанции. Разполагането на обект в паметта става с оператор, който е аналог на декларацията на променлива:

<име на класа> <име на инстанция> = new <име на класа>();

Конструктор по премълчаване

Методът, към който се обръща операторът new. Отделя място в паметта за една инстанция на класа. Носи името на класа и няма аргументи.

Както и при обикновените променливи, с един оператор може да се отдели памет за повече от една инстанция:

Car myCar = new Car();
Car myCar1 = new Car(), myCar2 = new Car(), myCar3 = new Car();

Достъп до атрибутите

След като сме създали обект от класа, използваме атрибутите му както всяка друга променлива. Достъпът става с конструкцията:

<име на инстанция>.<атрибут>

Тя може да стои във всеки оператор там, където би трябвало да стои име на променлива — и отляво, и отдясно на знака за присвояване:

myCar.brand = "FlyingCar";
myCar.engineVolume = 3000;

myCar.brand = Console.ReadLine();
Console.WriteLine(myCar.brand);
myCar.engineVolume = int.Parse(Console.ReadLine());

Внимание

Внимавай: Car myCar; само декларира променлива — обект още няма. Паметта за инстанцията се отделя чак с new Car(). Защо е така, ще видиш подробно в урок 19.

Задачи от урока

Задача 1 — приложението Car

Създава една инстанция на класа Car със стойности FlyingCar за марката, Mark1 за модела, 3000 см³ обем на двигателя и 2010 за годината на производство, и извежда атрибутите ѝ.

static void Main(string[] args)
{
    Car myCar = new Car();
    myCar.brand = "FlyingCar";
    myCar.model = "Mark1";
    myCar.engineVolume = 3000;
    myCar.yearProd = 2010;
    Console.Write(myCar.brand + "," + myCar.model + ",");
    Console.WriteLine(myCar.engineVolume + "," + myCar.yearProd);
}

Задача 2 — приложението Car1 (годишен данък)

Въвежда стойности на атрибутите на обект от класа Car и извежда дължимия годишен данък в левове. Едната съставка е 20% от обема на двигателя, а втората зависи от годината на производство:

Година на производствоВтора съставка
до 2000 г. включително70 лева
от 2001 до 2010 г.60 лева
след 2010 г.50 лева

Първата съставка се пресмята директно, а за втората се използва вложен условен оператор, за да се разграничат трите случая:

double annualTax = 0.2 * myCar.engineVolume;
if (myCar.yearProd <= 2000) annualTax += 70.00;
else if (myCar.yearProd <= 2010) annualTax += 60.00;
else annualTax += 50.00;

Съвет

Направи поне три теста — с година до 2000, между 2001 и 2010, и след 2010. Точно на границите (2000, 2001, 2010, 2011) най-често се крият грешките.

Задача 3 — класът Student

Атрибути: име, клас и номер в класа (от тип string) и оценки по шестте основни предмета (от тип double), плюс средно аритметично на шестте оценки.

public class Student
{
    // атрибути
    public string clas;      // клас
    public string id;        // номер в класа
    public string name;      // име на ученика
    // оценки по основните предмети
    public double dBEL, dForeign, dMath, dPhys, dChem, dBio;
    // среден успех
    public double average;
}

Приложението Stud въвежда стойности на атрибутите без средния успех, пресмята го и извежда справка за успеха на ученика.

Въпроси

Въпроси и задачи

1. Каква е ролята на модификатора public при дефиниране на атрибутите на клас?

2. Опитай да добавиш модификатора public в декларацията на свободна променлива в главната функция. Каква е реакцията на компилатора?

3. Проектирай и създай клас School с атрибути за основни данни за училище — име, адрес, телефон, уеб сайт. Напиши конзолно приложение, което въвежда данните за твоето училище и отговаря на въпроси от вида „Име на училището“, „Адрес на училището“ и т.н.

Упътване: организирай безкраен цикъл, който показва номерирани възможните въпроси, включително „Нямам повече въпроси“, и изисква от потребителя номер. След това с оператор за избор извеждай съответния отговор, като прекратиш цикъла, когато потребителят няма повече въпроси.

Какво трябва да запомниш

  • Дефинирането на клас е дефиниране на нов тип; инстанциите му са като променливи от този тип.
  • public пред атрибут го прави достъпен отвън; без него атрибутът е скрит.
  • Всеки клас получава наготово конструктор по премълчаване — без аргументи, с името на класа.
  • Car myCar; не създава обект. Обектът се появява с new.
  • Достъпът до атрибут е инстанция.атрибут и стои навсякъде, където може да стои променлива.