Ініціалізація в класах. Способи ініціалізації даних в класі. Ініціалізація змінних базових типів. Ініціалізація з допомогою ініціалізаторів об’єктів

Ініціалізація в класах. Способи ініціалізації даних в класі. Ініціалізація змінних базових типів. Ініціалізація з допомогою ініціалізаторів об’єктів


Зміст


1. Які є способи ініціалізації даних в класі при створенні об’єкту класу?

У мові C# створення об’єкту класу здійснюється з допомогою оператора new. Під час створення, внутрішні дані (змінні) класу можуть бути ініціалізовані одним з наступних способів:

  • з допомогою присвоєння змінній класу потрібного значення при її оголошенні (безпосередня ініціалізація). Цей спосіб використовується тільки для змінних базових типів. Якщо потрібно ініціалізувати об’єкт класу, то використовується ініціалізатор об’єктів;
  • з допомогою конструктора класу;
  • з допомогою ініціалізатора об’єктів. Цей спосіб застосовується для об’єктів класів чи структурних змінних. У цьому випадку, дані класу мають бути оголошені як загальнодоступні public.

2. Загальна форма ініціалізації внутрішніх даних класу з допомогою безпосереднього присвоєння потрібного значення

Внутрішні дані класу можуть бути ініціалізовані одразу при їх оголошенні з допомогою конструкції виду:

type variable = value;

У цій конструкції змінна з іменем variable типу type ініціалізується значенням value.

3. Приклад ініціалізації одиночної змінної базового типу у класі

Задано клас Month, який реалізує місяць року. У класі оголошується одна прихована змінна month, яка ініціалізується значенням 5 одразу при оголошенні

// клас, що реалізує місяць року
class Month
{
  // ініціалізація внутрішньої змінної при її оголошенні
  int month = 5;

  public int GetMonth() { return month; }
  public void SetMontgh(int _month) { month = _month; }
}

Демонстрація використання об’єкту класу Month в іншому програмному коді

Month mn = new Month();
int t = mn.GetMonth(); // t = 5

4. Приклад ініціалізації масиву змінних базового типу у класі

Демонструється ініціалізація масиву з 5 чисел типу double, який оголошується в класі ArrayDouble5.

// клас, що реалізує масив з 5 чисел типу double
class ArrayDouble5
{
  // ініціалізація масиву при оголошенні
  double[] A = { 3.5, 8.2, 1.6, 2.8, -0.0025 };

  // методи доступу
  // зчитати елемент масиву з номером index
  public double GetAi(int index)
  {
    if ((index >= 0) && (index < 5))
      return A[index];
    return 0.0;
  }

  // записати нове значення в елемент масиву
  public void SetAi(int index, double value)
  {
    if ((index >= 0) && (index < 5))
      A[index] = value;
  }
}

Використання класу може бути наступним

// ініціалізація масиву у класі
ArrayDouble5 ad = new ArrayDouble5();

double val = ad.GetAi(3); // val = 2.8
val = ad.GetAi(4); // val = -0.0025

5. Використання ініціалізатора об’єкту для ініціалізації об’єкту класу в іншому класі

Демонструється ініціалізація об’єктів класів з допомогою ініціалізаторів об’єктів. Задано три класи Line, Triangle, Figures. У класі Line оголошуються загальнодоступні (public) змінні, що описують координати відрізку на площині. У класі Triangle оголошуються загальнодоступні (public) змінні, що задають координати точок трикутника.



У класі Figures оголошуються два об’єкти (екземпляри) класів Line та Triangle. Укласі Figures здійснюється ініціалізація об’єктів класів Line та Triangle з допомогою ініціалізаторів об’єктів.

// клас, що реалізує лінію на координатній площині
class Line
{
  public int x1, y1, x2, y2;
}

// клас, що описує трикутник на координатній площині
class Triangle
{
  public int x1, y1, x2, y2, x3, y3;
}

// клас, що реалізує фігуру
class Figures
{
  // ініціалізація об'єкту класу
  Line ln = new Line { x1 = 0, y1 = 3, x2 = 2, y2 = 5 };
  Triangle tr = new Triangle { x1 = 1, y1 = 1, x2 = 4, y2 = 0, x3 = 2, y3 = 1 };

  // методи доступу
  public Line GetLine() { return ln; }
  public Triangle GetTriangle() { return tr; }
}

Демонстрація використання класу Figures

Figures fg = new Figures();
Line ln;
Triangle tr;
int t;

ln = fg.GetLine();
t = ln.x2; // t = 2
t = ln.y1; // t = 3

tr = fg.GetTriangle();
t = tr.y2; // t = 0
t = tr.x3; // t = 2

6. Використання ініціалізатора об’єкту для ініціалізації масиву об’єктів у класі

У прикладі продемонстровано ініціалізацію масиву об’єктів типу Worker у класі Workers. Ініціалізація здійснюється з допомогою ініціалізатору об’єктів.

// клас, що описує працівника
class Worker
{
  // обов'язково з модифікатором доступу public
  public string name; // П.І.Б. працівника
  public int age; // вік
  public double salary; // зарплата
}

// клас, в якому оголошується масив з 3 об'єктів типу Worker
class Workers
{
  public Worker[] wr = 
  {
    new Worker { name = "Filippov F.F.", age = 35, salary = 70320.55 },
    new Worker { name = "Johansonn S.", age = 37, salary = 66670.57 },
    new Worker { name = "Gustaffson G.G.", age = 69, salary = 129380.55 }
  };
}

Важливо: для того, щоб можна було ініціалізувати масив Worker[] у класі Workers, потрібно щоб дані класу Worker були оголошені з модифікатором доступу public.

Використання масиву об’єктів wr може бути наступним:

Workers W = new Workers();
string name;
int age;
double salary;

name = W.wr[1].name; // name = Johansonn S.
age = W.wr[1].age; // age = 37
salary = W.wr[1].salary; // salary = 66670.57

7. Використання ініціалізатора об’єкту для ініціалізації структурної змінної у класі

Оголошується структура Book, що реалізує книгу. У класі CBook демонструється ініціалізація структурної змінної типу Book.

Ініціалізація можлива тільки тоді, коли структурна змінна в класі представлена як тип-посилання. Це означає, що для структурної змінної виділяється пам’ять оператором new.

// структура, що описує книгу
struct Book
{
  public string title; // назва книги
  public string author; // П.І.Б. автора
  public int year; // рік випуску
  public float price; // вартість книги
}

class CBook
{
  // ініціалізація структурної змінної у класі як типу-посилання
  public Book b = new Book { title = "Tell the time 5+", author = "H. Cather", year = 2017, price = 110.00f };
}

Використання структурної об’єкту класу CBook може бути таким:

// об'єкт класу CBook
CBook cb = new CBook();
string ttl = cb.b.title; // ttl = "Tell the time 5+"

Важливо: для того, щоб можна було ініціалізувати об’єкт b типу Book у класі CBook, поля структури (title, author, year, price) мають бути оголошені як public.

8. Приклад використання ініціалізатора об’єкту для ініціалізації масиву структурних змінних

У даному прикладі демонструється оголошення та ініціалізація масиву структур типу Book у класі CBook.

// структура, що описує книгу
struct Book
{
  public string title; // назва книги
  public string author; // П.І.Б. автора
  public int year; // рік випуску
  public float price; // вартість книги
}

class Books
{
  // ініціалізація масиву структурних змінних в класі
  public Book[] B =
  {
    new Book { title = "Computer coding for kids", author = "Carol Vorderman", year = 2015, price = 320.00f },
    new Book { title = "Math and English", author = "Paul Broadbent", year = 2015, price = 310.00f },
    new Book { title = "Spelling 5+", author = "Hannah Catner", year = 2017, price = 0.00f }
  };
}

Використання об’єкту класу Books в іншому програмному коді

// об'єкт класу Books
Books bk = new Books();
string author = bk.B[2].author; // author = "Hannah Catner"

9. Приклад ініціалізації змінної та масиву змінних типу зчислення (enum)

Задано зчислення Months, що визначає місяці року. У прикладі демонструється:

  • ініціалізація змінної типу зчислення Months у класі CMonths. Ініціалізуються 3 змінні (члени даних класу) з іменами mn1, mn2, mn3;
  • ініціалізація масиву змінних типу зчислення Months у класі CMonths.

 

// місяць року
enum Months
{
  Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
}

// клас, в якому ініціалізуються внутрішні змінні типу зчислення
class CMonths
{
  public Months mn1 = Months.Feb;
  public Months mn2 = Months.Jun;
  public Months mn3 = Months.Nov;

  // масив змінних типу зчислення
  Months[] array = { Months.Sep, Months.Jun, Months.Jan };
}

10. Які вимоги накладаються на оголошення змінної класу у випадку ініціалізації цієї змінної ініціалізатором об’єкту?

Щоб ініціалізувати змінну класу з допомогою ініціалізатора об’єкту, ця змінна має бути оголошена як загальнодоступна з модифікатором доступу public. Інакше компілятор видасть повідомлення про помилку:

Variable is inaccessible due to its protection level

де variable – назва змінної у класі, яку потрібно ініціалізувати.


Зв’язані теми