C#. Приклади створення ієрархій класів з використанням успадкування

Приклади створення ієрархій класів з використанням успадкування

У даній темі розглядається два приклади розробки класів з використанням успадкування. Кожен приклад містить коментарі з поясненнями особливостей роботи відповідного фрагменту коду. При створенні ієрархій класів поліморфізм не використовується.
Тема буде корисна програмістам початківцям при вивченні основ програмування класів, що використовують успадкування.


Зміст


1. Приклад створення ієрархії класів. Класи Student, Aspirant

У прикладі демонструється

  • використання модифікатора доступу protected при успадкуванні;
  • використання ключового слова base у випадку виклику конструктора базового класу.
1.1. Умова задачі

Створити базовий клас Student, що буде містити інформацію про студента (прізвище, курс навчання, номер залікової книги). За допомогою механізму спадкування реалізувати клас Aspirant (аспірант – студент, що готується до захисту кандидатської дисертації). Клас Aspirant є похідним від класу Student.
У класах Student і Aspirant необхідно реалізувати наступні елементи:

  • конструктори класів з відповідною кількістю параметрів. У класі Aspirant для доступу до методів класу Student потрібно використовувати ключове слово base;
  • властивості get/set для доступу до полів класу;
  • метод Print(), що виводить інформацію про вміст полів класу.

 

1.2. Рішення. Текст програми

Задача розв’язується для додатка типу Console Application. Нижче приведений повний текст програми.

using static System.Console;

namespace ConsoleApp1
{
  // Базовий клас Student, містить інформацію про студента
  public class Student
  {
    // 1. Поля класу - оголошені як protected - видимі в похідних класах,
    // і невидимі з екземпляру класу
    protected string name; // Прізвище й ім'я студента
    protected int course; // Курс навчання
    protected string gradeBook; // Номер залікової книги

    // 2. Конструктор класу з 3 параметрами
    public Student(string Name, int course, string gradeBook)
    {
      this.Name = Name;
      this.course = course;
      this.gradeBook = gradeBook;
    }

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

    public int Course
    {
      get { return course; }
      set { course = value; }
    }

    public string GradeBook
    {
      get { return gradeBook; }
      set { gradeBook = value; }
    }

    // 4. Метод Print() - вивести значення полів на екран
    public void Print()
    {
      WriteLine("The values of fields are:");
      WriteLine($"Name = {name}");
      WriteLine($"Course = {course}");
      WriteLine($"GradeBook = {gradeBook}");
    }
  }

  // Клас Aspirant - успадковує можливості класу Student
  public class Aspirant : Student
  {
    // 1. Внутрішнє поле класу
    protected string topic; // Тема кандидатської дисертації

    // 2. Конструктор класу Aspirant - за допомогою ключового слова base звертається
    // до конструктора базового класу Student
    public Aspirant(string name, int course, string gradeBook, string topic) :
    base(name, course, gradeBook)
    {
      // Можна змінювати protected-члени базового класу
      base.name = name; // доступ до поля name класу Student за допомогою base
      this.course = course; // доступ до поля course класу Student за допомогою this
      this.gradeBook = gradeBook;

      this.topic = topic; // ініціалізація внутрішнього поля класу Aspirant
    }

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

    // 4. Метод Print() - друк полів класу Aspirant
    // Ім'я даного методу перекриває ім'я методу Student.Print(),
    // тому перед іменем методу вказується new
    public new void Print() // new - перевизначення методу базового класу
    {
      base.Print(); // викликати метод Print() базового класу
      WriteLine($"Topic = {topic}");
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // Демонстрація роботи з класами Student і Aspirant

      // 1. Оголосити екземпляр класу Student
      Student st1 = new Student("Ivanov I.I.", 2, "0519");

      // 2. Вивести поля класу Student
      WriteLine("The instance of st1:");
      st1.Print();

      // 3. Оголосити екземпляр класу Aspirant
      // При оголошенні використовується властивість get екземпляра st1
      Aspirant asp1 = new Aspirant(st1.Name, st1.Course, st1.GradeBook, "Hello world!");

      // 4. Викликати метод Print() екземпляра asp1
      WriteLine("---------------------");
      WriteLine("The instance of asp1:");
      asp1.Print();
    }
  }
}

 



1.3. Результат роботи програми
The instance of st1:
The values of fields are:
Name = Ivanov I.I.
Course = 2
GradeBook = 0519
---------------------
The instance of asp1:
The values of fields are:
Name = Ivanov I.I.
Course = 2
GradeBook = 0519
Topic = Hello world!

 

2. Реалізація успадкування на прикладі класу Book

2.1. Умова задачі

Задано клас Book, що описує книгу. Клас містить наступні елементи:

  • назва книги;
  • прізвище й ім’я автора;
  • вартість книги.

У класі Book потрібно реалізувати наступні методи:

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

Розробити клас BookGenre, що успадковує можливості класу Book і додає поле жанру (genre). У класі BookGenre реалізувати наступні елементи:

  • конструктор з 4 параметрами – реалізує виклик конструктора базового класу;
  • властивість get/set доступу до внутрішнього поля класу;
  • метод Print(), що звертається до методу Print() базового класу Book для виведення інформації про всі поля класу.

Розробити клас BookGenrePubl, що успадкований від класу BookGenre. Даний клас додає поле, що містить інформацію про видавця. У класі BookGenrePubl реалізувати наступні елементи:

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

Клас BookGenrePubl зробити таким, що не може бути успадкований.

 

2.2. Рішення. Текст програми
using static System.Console;

namespace ConsoleApp1
{
  // Клас Book - базовий клас
  class Book
  {
    // 1. Внутрішні поля класу
    string title; // назва (заголовок) книги
    string author; // прізвище й ім'я автора
    double price; // вартість книги

    // 2. Конструктор з 3 параметрами
    public Book(string _title, string _author, double _price)
    {
      title = _title;
      author = _author;

      // корегування вартості книги
      if (price < 0) price = 0.0;
      else price = _price;
    }

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

    public string Author
    {
      get { return author; }
      set { author = value; }
    }

    public double Price
    {
      get { return price; }
      set
      {
        if (price < 0) price = 0.0;
        else price = value;
      }
    }

    // 4. Метод Print() - вивести поля класу
    public void Print()
    {
      WriteLine("title = {0}, author = {1}, price = {2:f2}", title, author, price);
    }
  }

  // Клас, що успадковує клас Book - додає жанр до книги.
  class BookGenre : Book
  {
    // 1. Внутрішнє поле - жанр, до якого відноситься книга
    string genre;

    // 2. Конструктор з 4 параметрами.
    // Викликає конструктор базового класу за допомогою base(...).
    public BookGenre(string _title, string _author, double _price, string _genre) :
            base(_title, _author, _price)
    {
      genre = _genre;
    }

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

    // 4. Метод Print() - викликає метод базового класу
    // У заголовку методу використовується ключове слово new. Це
    // є рекомендація компілятора - підкреслити, що даний метод
    // ховає однойменний метод базового класу.
    public new void Print()
    {
      base.Print(); // викликати метод Print() базового класу Book
      WriteLine("genre = {0}", genre);
    }
  }

  // Клас, що успадковує клас BookGenre - додає до ієрархії класів
  // поле видавця.
  // Перед класом використовується ключове слово sealed - це означає,
  // що даний клас не може бути успадкований іншими класами.
  sealed class BookGenrePubl : BookGenre
  {
    // 1. Внутрішнє поле - інформація про видавця
    private string publisher;

    // 2. Конструктор з 5 параметрами - Викликає конструктор базового
    // класу BookGenre() за допомогою ключового слова base.
    public BookGenrePubl(string _title, string _author, double _price,
      string _genre, string _publisher) : base(_title, _author, _price, _genre)
    {
      publisher = _publisher;
    }

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

    // 4. Метод Print() - викликає метод базового класу.
    // В оголошенні методу рекомендується використовувати
    // ключове слово new, тому що даний метод "ховає" метод базового класу.
    public new void Print()
    {
      base.Print();
      WriteLine("publisher = {0}", publisher);
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // 1. Оголосити екземпляр класу Book
      Book b1 = new Book("Title - 01", "Author - 01", 122.25);

      // 2. Вивести значення полів класу екземпляра b1
      b1.Print();

      // 3. Оголосити екземпляр класу BookGenre
      BookGenre bg1 = new BookGenre("Title - BookGenre", "Author - BookGenre", 200.33, "Story");

      // 4. Вивести значення полів екземпляра bg1
      WriteLine("-------------------");
      bg1.Print();

      // 5. Оголосити екземпляр класу BookGenrePubl
      BookGenrePubl bp1 = new BookGenrePubl("Title - BookGenrePubl", "Aurhor - BookGenrePubl",
          300.55, "Story", "Pupkin Inc.");

      // 6. Вивести значення полів екземпляра bp1
      WriteLine("-------------------");
      bp1.Print();
    }
  }
}

 

2.3. Результат роботи програми
title = Title - 01, author = Author - 01, price = 122.25
-------------------
title = Title - BookGenre, author = Author - BookGenre, price = 200.33
genre = Story
-------------------
title = Title - BookGenrePubl, author = Aurhor - BookGenrePubl, price = 300.55
genre = Story
publisher = Pupkin Inc.

 


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