Приклад доступу до методів та властивостей успадкованих класів з допомогою посилання на базовий клас. Приклад
У прикладі вивчається:
- способи доступу до екземплярів успадкованих класів з допомогою посилання на базовий клас;
- вивчення особливостей використання ключових слів 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("-----------------------"); } } } }
⇑
Зв’язані теми
- Використання посилання на базовий клас. Ключові слова as, is. Способи виклику методів з однаковими іменами в ієрархіях успадкування
- Спадковість. Основні поняття. Переваги та недоліки. Загальна форма. Найпростіші приклади. Модифікатор доступу protected
⇑