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




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

У прикладі вивчається:

  • способи доступу до екземплярів успадкованих класів з допомогою посилання на базовий клас;
  • вивчення особливостей використання ключових слів is, as;
  • способи виклику методів в ієрархії класів, які мають однакові імена.

Зміст


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

Умова задачі

Оголосити клас Figure, який містить поле name, яке визначає назву фігури. У класі Figure оголосити наступні методи:

  • конструктор з 1 параметром;
  • метод Display(), який відображає назву фігури.

З класу Figure успадкувати клас Rectangle (прямокутник), який містить наступні поля:

  • координату лівого верхнього кута (x1; y1);
  • координату правого нижнього кута (x2; y2).

У класі Rectangle реалізувати наступні методи та функції:

  • конструктор з 5 параметрами, який викликає конструктор базового класу Figure;
  • конструктор без параметрів, який реалізує встановлення координат кутів (0; 0), (1; 1) та викликає конструктор з 5 параметрами з допомогою засобу this;
  • метод Display(), який відображає назву фігури та значення внутрішніх полів. Даний метод звертається до однойменного методу базового класу;
  • метод Area(), який повертає площу прямокутника.

З класу Rectangle успадкувати клас RectangleColor. У класі RectangleColor реалізувати поле color (колір) та наступні методи;

  • конструктор з 6 параметрами, який викликає конструктор базового класу Rectangle;
  • конструктор без параметрів, який встановлює координати (0; 0), (1; 1) та викликає конструктор з 6 параметрами з допомогою засобу this;
  • метод Display(), який відображає назву фігури та значення внутрішніх полів. Даний метод звертається до однойменного методу базового класу;
  • метод Area(), який повертає площу прямокутника. У методі викликається метод Area() базового класу.

У функції Main() виконати наступні дії:

    • оголосити посилання на базовий клас Figure;
    • створити екземпляри класів Rectangle та RectangleColor;
  • продемонструвати доступ до методів похідних класів з допомогою посилання на клас Figure.

 



Виконання. Текст програми

Нижче наведений розв’язок задачі. Програма реалізована як додаток Console Application.

using System;
using static System.Console;

namespace ConsoleApp1
{
  // Клас Figure
  class Figure
  {
    // Приховане поле класу
    protected string name;

    // Конструктор з 1 параметром
    public Figure(string name) { this.name = name; }

    // Метод Display()
    public void Display()
    {
      WriteLine("Figure.name = {0}", name);
    }
  }

  // Клас Rectangle - успадковує (розширює) можливості класу Figure
  class Rectangle : Figure
  {
    // Приховані поля - координати точок
    protected double x1, y1, x2, y2;

    // Конструктор з 5 параметрами
    public Rectangle(string name, double x1, double y1, double x2, double y2) :
            base(name) // викликати конструктор базового класу
    {
      this.x1 = x1; this.y1 = y1;
      this.x2 = x2; this.y2 = y2;
    }

    // Конструктор без параметрів, викликає конструктор з 5 параметрами
    public Rectangle() : this("Rectangle", 0, 0, 1, 1) { }

    // Метод Display() - виводить значення полів,
    // викликає однойменний метод базового класу.
    // Даний метод перевизначає метод Diplay() базового
    // класу Figure, тому вказується ключове слово new
    public new void Display()
    {
      base.Display(); // викликати метод Display базового класу

      Write("Rectangle: x1 = {0:f2}, y1 = {1:f2}, ", x1, y2);
      WriteLine("x2 = {0:f2}, y2 = {1:f2}", x2, y2);
    }

    // Метод, що повертає площу прямокутника
    public double Area()
    {
      return Math.Abs(x1 - x2) * Math.Abs(y1 - y2);
    }
  }

  // Клас RectangleColor - додає до прямокутника колір,
  // успадковує можливості класу Rectangle
  class RectangleColor : Rectangle
  {
    // Приховане поле класу
    protected int color = 0;

    // Конструктор з 6 параметрами,
    // викликає конструктор базового класу Rectangle
    public RectangleColor(string name, double x1, double x2,
        double y1, double y2, int color) : base(name, x1, y1, x2, y2)
    {
      this.color = color;
    }

    // Конструктор без параметрів,
    // викликає конструктор з 6 параметрами
    public RectangleColor() : this("RectangleColor", 0, 0, 1, 1, 0) { }

    // Метод Display() - викликає однойменний метод базового класу,
    // щоб його не сховати, потрібно використовувати ключове слово new
    public new void Display()
    {
      base.Display();
      WriteLine("RectangleColor.color = {0}", color);
    }

    // Метод обчислення площі
    public new double Area()
    {
      return base.Area(); // виклик методу Area() базового класу
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // 1. Оголосити посилання на базовий клас
      Figure refFg;

      // 2. Створити екземпляри класів Figure, Rectangle, Rectangle
      Figure objFg = new Figure("Figure");
      Rectangle objRect = new Rectangle("Rectangle", 1, 2, 5, -4);
      RectangleColor objRectCol = new RectangleColor("RectangleColor", 1, 8, -1, 3, 2);

      // 3. Присвоїти посиланню refFg значення посилання objFg на базовий клас Figure
      refFg = objFg;
      refFg.Display(); // Викликається метод Display() класу Figure
      WriteLine("-----------------------");

      // 4. Присвоїти посиланню refFg значення посилання objRect
      refFg = objRect;

      // 4.1. Викликається метод Display() класу Figure
      refFg.Display();
      WriteLine("-----------------------");

      // 4.2. Викликається метод Display() класу Rectangle - спосіб 1
      try
      {
        ((Rectangle)refFg).Display(); // явне приведення до типу Rectangle
        WriteLine("-----------------------");
      }
      catch
      {
        // якщо приведення до типу відбулось некоректно, то вихід
        WriteLine("Error.");
        return;
      }

      // 4.3. Викликається метод Display() класу Rectangle - спосіб 2.
      // У цьому способі використовується ключове слово as,
      // яке реалізує спробу приведення одного типу до іншого,
      // у нашому випадку Figure => Rectangle
      Rectangle r = refFg as Rectangle; // оголосити додаткове посилання типу Rectangle

      if (r != null) r.Display();
        WriteLine("-----------------------");

      // 4.4. Викликається метод Display() класу Rectangle - спосіб 3.
      // Тут використовується ключове слово is, яке дозволяє
      // визначити сумісність типів, результат перевірки - тип bool.
      // Якщо типи можна привести, то повертається true, інакше false.
      if (refFg is Rectangle)
      {
        (refFg as Rectangle).Display();
        WriteLine("-----------------------");
      }

      // 5. Оголосити посилання на екземпляр класу RectangleColor
      refFg = objRectCol;

      // 5.1. Викликати метод Display() базового класу Figure (а не Rectangle)
      refFg.Display();
      WriteLine("-----------------------");

      // 5.2. Викликати метод Display() класу Rectangle одним зі способів,
      // які описані в п.п. 4.2 - 4.4.
      try
      {
        ((Rectangle)refFg).Display();
        WriteLine("-----------------------");
      }
      catch
      {
        WriteLine("Error.");
        return;
      }

      // 5.3. Викликати метод Display() класу RectangleColor одним зі способів,
      // описаних в п.п. 4.2 - 4.4.
      if (refFg is RectangleColor)
      {
        (refFg as RectangleColor).Display();
        WriteLine("-----------------------");
      }
    }
  }
}

 


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