C#. Приклад розробки програми, яка розміщується в різних файлах. Реалізація успадкування у класах. Засоби MS Visual Studio 2019 розбиття програми на частини




Приклад розробки програми, яка розміщується в різних файлах. Реалізація успадкування у класах. Засоби MS Visual Studio 2019 розбиття програми на частини


Зміст


Пошук на інших ресурсах:

Вступ

При побудові ієрархій класів, що містять великі об’єми програмного коду, доцільно реалізовувати кожен клас в окремому файлі (модулі). Розбиття об’ємних програм на окремі частини (файли) має наступні переваги:

  • полегшує сприйняття загальної структури програми;
  • прискорює пошук потрібних фрагментів коду;
  • зменшує кількість важковловимих помилок, пов’язаних з різномаїттям кодів зконцентрованих в одному файлі.

У даному прикладі з допомогою засобів Microsoft Visual Studio 19 розроблено програму код якої розбитий на різні частини. Кожна частина програми реалізована в окремому файлі. З метою зручності використання, у кожному файлі оголошується окремий клас. Ім’я кожного файлу співпадає з іменем класу, що в ньому реалізований.
Приклад демонструє реалізацію 3 класів, які взаємодіють між собою з допомогою відношення спадковості (відношення is-a).

 

Умова задачі

Реалізувати ієрархію класів. Базовий клас Human містить інформацію:

  • прізвище;
  • ім’я;
  • стать.

Від класу Human потрібно успадкувати похідний клас Citizen, який містить наступну інформацію:

  • номер паспорту;
  • адреса проживання.

Від класу Citizen потрібно успадкувати похідний клас ForeignCitizen, який містить додаткову інформацію про:

  • номер закордонного паспорту;
  • дату відкриття візи;
  • дату закінчення візи.

У всіх класах повинні бути наступні елементи:

  • конструктор з параметрами, який ініціалізує усі поля конкретного класу;
  • властивості get/set для доступу до полів класів;
  • метод Print(), який виводить інформацію про поля класу на екран.

Додаткові умови:

  • класи повинні бути в різних модулях. Клас Human реалізувати в модулі (файлі) “human.cs”, клас Citizen реалізувати в модулі “citizen.cs“, клас ForeignCitizen реалізувати в модулі “foreigncitizen.cs“;
  • клас ForeignCitizen повинен бути останнім в ієрархії і не підтримувати успадкування (sealed-клас).

 

Виконання

1. Створення проекту за шаблоном Console Application

Після запуску MS Visual Studio 2019 потрібно створити новий проект. Це здійснюється стандартним способом з допомогою послідовності команд

File->New->Project...

Якщо Visual Studio 2019 щойно запустився на виконання, то система автоматично відкриє відповідне вікно, в якому можна створити новий проект або вибрати вже існуючі проекти.

З допомогою віконного інтерфейсу потрібно виконати такі дії (рисунок 1):

  • в елементі вибору мови програмування вибрати C#;
  • в переліку шаблонів вибрати Console App (.NET Core);
  • для переходу далі вибрати кнопку Next.

MS Visual Studio 2019. Вікно "Create a New Project" створення нового проекту

Рисунок 1. Вікно “Create a New Project” створення нового проекту в MS Visual Studio 2019

Після виконаних дій відкриється нове вікно “Configure your new project” (рисунок 2). У цьому вікні потрібно вказати ім’я проекту, його розміщення та ім’я рішення.
У нашому випадку задається ім’я DemoSplitFiles. Розміщення Location та ім’я рішення можна залишити за замовчуванням, яке встановлене Visual Studio. Після вибору кнопки Create система згенерує шаблон консольного додатку.

MS Visual Studio 2019. Вікно "Configure your new project"

Рисунок 2. Вікно “Configure your new project”

 

2. Початкова конфігурація програми

На даний момент програма складається з одного файлу Program.cs. У цьому файлі оголошується клас Program, який містить точку входу в програму – статичну функцію Main().

На даний момент текст модуля Program.cs наступний

using System;

namespace DemoSplitFiles
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Hello World!");
    }
  }
}

 

3. Додавання класу Human та файлу Human.cs

У цьому пункті детально описується додавання нового файлу до проекту. Згідно з умовою задачі, клас Human повинен бути реалізований в файлі (модулі) human.cs.

Система Visual Studio 2019 (та й інші версії) побудована таким чином, що при додаванні нового класу з допомогою інтерфейсу Visual Studio, цей клас автоматично буде розміщуватись в новому файлі. Потрібно тільки вказати ім’я цього файлу.

Щоб додати новий клас до проекту, в головному меню потрібно викликати послідовність команд

Project->Add Class...

як показано на рисунку 3.

MS Visual Studio 2019 - C#. Команда "Add Class...". Додавання нового класу до проекту

Рисунок 3. Команда “Add Class…”. Додавання нового класу до проекту

У результаті відкриється вікно “Add New Item – DemoSplitFiles” в якому потрібно виконати наступні дії:

  • у переліку груп інсталльованих елементів вибрати “Visual C# Items”;
  • в центрі вікна з переліку елементів вибрати елемент Class;
  • у полі Name задати ім’я файлу Human.cs;
  • після виконання налаштувань вибрати кнопку Add.

 

MS Visual Studio 2019 - C#. Вікно "Add New Item". Задавання імені файлу для класу

Рисунок 4. Вікно “Add New Item”. Задавання імені файлу для класу Human

У результаті виконаних дій буде створено клас Human, який розміщується в файлі Human.cs (рисунок 5).

MS Visual Studio - C#. Вікно програми з активним файлом Human.cs

Рисунок 5. Вікно програми з активним файлом Human.cs

Як видно з рисунку 5, на даний момент програма складається з двох файлів:

  • Human.cs – файл, в якому розміщується клас Human;
  • Program.cs – файл, в якому розміщується клас Program.

Обидва класи розміщуються в одному просторі імен DemoSplitFiles.

Текст класу Human поки що наступний

using System;
using System.Collections.Generic;
using System.Text;

namespace DemoSplitFiles
{
  class Human
  {
  }
}

 



4. Додавання класу Citizen та файлу Citizen.cs.

На цьому етапі потрібно додати клас Citizen та файл Citizen.cs. Додавання класу Citizen здійснюється за зразком додавання класу Human (дивіться попередній пункт 2.3).

Після того, як клас Citizen буде додано, текст файлу Citizen.cs буде наступний

using System;
using System.Collections.Generic;
using System.Text;

namespace DemoSplitFiles
{
  class Citizen
  {
  }
}

Клас Citizen розміщується у просторі імен DemoSplitFiles як і попередні класи Program та Human.

 

5. Додавання класу ForeignCitizen та файлу ForeignCitizen.cs.

За зразком попередніх класів Human, Citizen додається клас ForeignCitizen. Після додавання, клас розміщується в окремому файлі ForeignCitizen.cs та містить наступний код

using System;
using System.Collections.Generic;
using System.Text;

namespace DemoSplitFiles
{
  class ForeignCitizen
  {
  }
}

 

6. Структура програми

На даний момент программа складається з 4 файлів:

  • Program.cs – містить текст класу Program, в якому описується статична функція Main(). Ця функція є точкою входу в програму, вона виконується першою при запуску застосунку;
  • Human.cs – містить текст класу Human, який є базовим для класів Citizen та ForeignCitizen;
  • Citizen.cs – містить текст класу Citizen, який успадкований від класу Human і є базовим для класу ForeignCitizen;
  • ForeignCitizen.cs – містить текст класу ForeignCitizen, який успадкований від класу Citizen.

 

7. Програмний код класу Human

Клас Human є базовий в ієрархії класів. Текст програми, розміщеної у файлі Human.cs наведено нижче.

using System;

namespace DemoSplitFiles
{
  // Клас Human - описує людину в загальному
  class Human
  {
    // 1. Внутрішні поля класу
    protected string name; // Ім'я людини
    protected string surname; // Прізвище
    protected bool sex; // Стать: true - жіноча, false - чоловіча

    // 2. Конструктор з 3 параметрами
    public Human(string _name, string _surname, bool _sex)
    {
      name = _name;
      surname = _surname;
      sex = _sex;
    }

    // 3. Властивості для доступу до внутрішніх полів класу
    public string Name
    {
      get { return name; }
      set { name = value; }
    }

    public string Surname
    {
      get { return surname; }
      set { surname = value; }
    }

    public bool Sex
    {
      get { return sex; }
      set { sex = value; }
    }

    // 4. Метод Print() - виводить імена полів класу на екран
    public void Print()
    {
      Console.WriteLine("name: {0}", name);
      Console.WriteLine("surname: {0}", surname);
      if (sex)
        Console.WriteLine("sex: Female");
      else
        Console.WriteLine("sex: Male");
    }
  }
}

 

8. Програмний код класу Citizen

Текст файлу Citizen.cs, в якому розміщується клас Citizen наступний.

using System;

namespace DemoSplitFiles
{
  // Клас Citizen - успадкований від класу Human
  class Citizen : Human
  {
    // 1. Внутрішні поля класу
    protected string password; // Номер паспорту
    protected string address; // Адреса проживання

    // 2. Конструктор класу - викликає конструктор базового класу
    public Citizen(string _name, string _surname, bool _sex,
            string _password, string _address) : base(_name, _surname, _sex)
    {
      password = _password;
      address = _address;
    }

    // 3. Властивості доступу до полів класу
    public string Password
    {
      get { return password; }
      set { password = value; }
    }

    public string Address
    {
      get { return address; }
      set { address = value; }
    }

    // 4. Метод, що виводить значення полів класу
    public new void Print()
    {
      base.Print(); // виклик методу базового класу
      Console.WriteLine("password: {0}", password);
      Console.WriteLine("address: {0}", address);
    }
  }
}

 

9. Програмний код класу ForeignCitizen

Текст файлу ForeignCitizen.cs, в якому розміщуєтся класс ForeignCitizen наступний.

using System;

namespace DemoSplitFiles
{
  // Клас ForeignCitizen - успадковує клас Citizen.
  // Даний клас є запечатаний - не може бути успадкований іншим класом.
  sealed class ForeignCitizen : Citizen
  {
    // 1. Внутрішні поля класу
    private string foreignPassport; // номер закордонного паспорту
    private DateTime visaOpen; // дата відкриття візи
    private DateTime visaClose; // дата закриття візи

    // 2. Конструктор класу - викликає конструктор базового класу
    public ForeignCitizen(string _name, string _surname, bool _sex,
        string _password, string _address,
        string _foreignPassport, DateTime _visaOpen, DateTime _visaClose)
            : base(_name, _surname, _sex, _password, _address)
    {
      foreignPassport = _foreignPassport;
      visaOpen = _visaOpen;
      visaClose = _visaClose;
    }

    // 3. Властивості для доступу до полів класу
    public string ForeignPassport
    {
      get { return foreignPassport; }
      set { foreignPassport = value; }
    }

    public DateTime VisaOpen
    {
      get { return visaOpen; }
      set { visaOpen = value; }
    }

    public DateTime VisaClose
    {
      get { return visaClose; }
      set { visaClose = value; }
    }

    // 4. Метод Print() - виведення полів класу
    public new void Print()
    {
      base.Print(); // виклик методу базового класу
      Console.WriteLine("foreignPassport: {0}", foreignPassport);
      Console.WriteLine("visaOpen: {0}", visaOpen);
      Console.WriteLine("visaClose: {0}", visaClose);
    }
  }
}

 

10. Текст функції Main(). Тестування роботи програми

Функція Main() реалізована в класі Program, який оголошено у файлі Program.cs. В функції Main() демонструється створення екземплярів розроблених класів, реалізованих в інших файлах. Оскільки всі класи оголошені в просторі імен DemoSplitFiles, то для використання імен цих класів не потрібно вказувати додаткових уточнень чи яких небудь інших дій. Як показує даний приклад, робота з класами, розміщеними в різних файлах MS Visual Studio – C# є досить зручною.
Нижче наведено текст файлу Program.cs.

using System;

namespace DemoSplitFiles
{
  class Program
  {
    static void Main(string[] args)
    {
      // 1. Використання екземпляру класу Human
      Human hm = new Human("John", "Johnson", false);
      hm.Print();

      // 2. Використання екземпляру класу Citizen
      Citizen ct = new Citizen("Petr", "Petrenko", false, "A101ksdl233", "New City");
      Console.WriteLine("------------------------");
      ct.Print(); // вивести значення полів класу

      // 3. Використання екземпляру класу ForeignCitizen
      ForeignCitizen fc = new ForeignCitizen("Ivanov", "Ivan", false,
          "0230902ADK", "London", "023329032JJK",
          Convert.ToDateTime("02.02.2020"),  Convert.ToDateTime("03.03.2085"));
          Console.WriteLine("------------------");
      fc.Print();
    }
  }
}

 

11. Результат роботи програми

Після запуску на виконання програми отримано наступний результат

name: John
surname: Johnson
sex: Male
------------------------
name: Petr
surname: Petrenko
sex: Male
password: A101ksdl233
address: New City
------------------
name: Ivanov
surname: Ivan
sex: Male
password: 0230902ADK
address: London
foreignPassport: 023329032JJK
visaOpen: 2/2/2020 12:00:00 AM
visaClose: 3/3/2085 12:00:00 AM

 


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