C#. Приклад рішення задач, що використовують статичні дані та методи в класі

Приклад рішення задач, що використовують статичні дані та методи в класі

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


Зміст


Умова задачі

Завдання 1. Дано клас Point, що реалізує точку на координатній площині. Реалізувати підрахунок кількості створених екземплярів типу Point. Клас Point оголошується як нестатичний.

Завдання 2. Модифікувати клас Point наступним чином:

  • додати статичний метод LengthPoints() для обчислення відстані між двома точками. Метод повинен отримувати в якості параметрів екземпляри типу Point.

У функції main() продемонструвати виклик статичного методу LengthPoints().

 

Міркування

Щоб підрахувати кількість екземплярів типу Point потрібно створити статичне поле (елемент даних) count. Потім в статичному конструкторі ініціалізувати це поле значенням 0. При створенні нового екземпляру класу Point, статичне поле count повинно збільшуватись на 1. Отже, код приросту count++ потрібно помістити в нестатичні конструктори класу Point.

 

Завдання 1. Розв’язок

Рішення задачі реалізоване в застосунку C# за шаблоном Console Application. У класі Point реалізовано наступні елементи:

  • внутрішні приховані (private) змінні x, y, що визначають координати точки;
  • статична змінна count, яка використовується для підрахунку кількості створених екземплярів класу;
  • нестатичний конструктор Point(double, double) з двома параметрами які ініціалізують однойменні внутрішні поля класу;
  • нестатичний конструктор Point() без параметрів, який ініціалізує внутрішні поля класу заченням 1.0;
  • статичний конструктор Point(), який ініціалізує статичну змінну count нульовим значенням;
  • методи доступу до внутрішніх змінних x, y з іменами GetX(), GetY(), SetX(), SetY();
  • метод Print() – призначений для виведення внутрішніх полів класу на екран.

У функції main() демонструється використання екземпляру класу Point та підрахунок кількості створених екземплярів цього класу.

Текст програми наступний.

using System;
using static System.Console; // Підключити статичний клас System.Console

namespace ConsoleApp2
{
  // Тема: Статичні методи та дані класу
  // Нестатичний клас Point
  class Point
  {
    // 1. Внутрішні поля класу Point
    // координати точки
    private double x;
    private double y;

    // кількість екземплярів класу Point - статичне поле
    // якщо забрати public, то поле буде видиме тільки в межах класу
    public static int count;

    // 2. Статичний конструктор
    //     - ініціалізує тільки статичні поля класу
    //     - не може мати параметрів і модифікаторів доступу
    //     - виконується тільки один раз
    //     - викликається середовищем .NET
    static Point()
    {
      count = 0;
      // x = y = 0; - помилка, нестатичні поля класу не можна ініціалізувати в статичному конструкторі
    }

    // 3. Нестатичний конструктор - ініціалізує нестатичні поля класу
    public Point()
    {
      x = y = 1.0;

      // Конструктор викликається при створенні екземпляру класу Point,
      // тому потрібно збільшити статичне поле на 1
      count++;
    }

    // 4. Ще один нестатичний конструктор з двома параметрами
    public Point (double x, double y)
    {
      this.x = x;
      this.y = y;

      // Конструктор викликається при створенні екземпляру класу Point,
      // тому потрібно збільшити статичне поле на 1
      Point.count++; // інший спосіб доступу до count
    }

    // 5. Методи доступу
    public double GetX() { return x; }
    public double GetY() { return y; }
    public void SetX(double x) { this.x = x; }
    public void SetY(double y) { this.y = y; }

    // 6. Метод, що виводить поля класу
    public void Print()
    {
      WriteLine("Fields of instance: ");
      WriteLine("x = {0}, y = {1}", x, y);
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // 1. Оголосити декілька екземплярів класу
      Point pt1 = new Point(); // одиночний екземпляр
      Point pt2 = new Point(2, 3.5);

      // 2. Вивести екземпляри класу
      Write("Object pt1. ");
      pt1.Print();
      Write("Object pt2. ");
      pt2.Print();

      // 3. Вивести статичне поле Point.count
      WriteLine($"Static field Point.count = {Point.count}"); // count = 2

      // 4. Оголосити масив екземплярів
      Point[] ptArray = new Point[5]; // створити масив посилань на Point

      // 5. Вивести статичне поле Point.count ще раз
      WriteLine($"Static field Point.count = {Point.count}"); // count = 2

      // 6. Виділити пам'ять для кожного елементу масиву типу Point
      for (int i=0; i<ptArray.Length; i++)
      {
        // при кожному виклику конструктора статичне поле count збільшується на 1
        ptArray[i] = new Point(i, i * i);
      }

      // 7. Вивести значення Point.count - кількість створених екземплярів класу
      WriteLine($"Static field Point.count = {Point.count}"); // count = 7
    }
  }
}


 

Завдання 2. Розв’язок

Для виконання завдання 2 у текст класу Point потрібно додати код статичного методу LengthPoints(), лістинг якого наступний

...

// Нестатичний клас Point
class Point
{

  // попередній код залишається без змін
  // ...

  // 7.Статичний метод LengthPoints() - обчислює відстань між двома точками типу Point
  public static double LengthPoints(Point p1, Point p2)
  {
    double len;
    len = Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
    return len;
  }
}

...

Для демонстрації методу LengthPoints() у текст функції main() потрібно додати відповідний код виклику:

static void Main(string[] args)
{

  // попередній код залишається без змін
  // ...

  // 8. Демонстрація виклику статичного методу LengthPoints()
  WriteLine("Length between pt1 and pt2 is: {0:f3}", Point.LengthPoints(pt1, pt2));
}

Результат виконання програми

Object pt1. Fields of instance:
x = 1, y = 1
Object pt2. Fields of instance:
x = 2, y = 3.5
Static field Point.count = 2
Static field Point.count = 2
Static field Point.count = 7

 


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