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 Set(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

 


Связанные темы