OOP Course
Сьогодні

Підрозділ 4.4

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

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

4.4. Приховування методів та властивостей

У попередньому розділі ми розглянули перевизначення — механізм заміни реалізації віртуального методу в похідному класі. Проте іноді виникає ситуація, коли метод у базовому класі не є virtual, а отже не може бути перевизначений. Або ж нас влаштовує поточна реалізація для базового типу, але в похідному класі потрібна інша поведінка. У таких випадках застосовується приховування (hiding / shadowing).

Приховування полягає у визначенні в похідному класі члена з тим самим іменем і набором параметрів, що й у базовому класі. Для явного позначення приховування використовується ключове слово new. Якщо new не вказати — компілятор видасть попередження, але код скомпілюється.

Приховування методів

Розглянемо базовий клас Person із звичайним (не virtual) методом Print(). Клас Doctor хоче вивести у Print() додаткову інформацію про спеціалізацію, але перевизначити невіртуальний метод неможливо — тому використовується new:

Ключове слово new сигналізує компілятору та читачу коду: «це навмисне приховування, а не помилка». Без new код працює так само, але компілятор виведе попередження CS0108.

Виклик базового методу через base

Якщо у прихованому методі потрібно скористатися реалізацією базового класу, можна звернутися до неї через base:

Ключова відмінність від override

Приховування і перевизначення виглядають схоже, але поводяться принципово по-різному. Якщо об'єкт Doctor зберігається у змінній типу Person, то:

  • при перевизначенні (override) — виконається Doctor.Print()
  • при приховуванні (new) — виконається Person.Print()

Результат: Person.Print: Олена Коваль — виконується метод класу Person, хоча реальний об'єкт є Doctor. Саме тому для поліморфної поведінки потрібен override, а не new.

new (приховування) vs override (перевизначення) — поведінка через змінну базового типу

Приховування властивостей

Так само як і методи, можна приховувати властивості. Це корисно, коли потрібно змінити логіку доступу у похідному класі без оголошення virtual у базовому:

У блоці get звертаємось до base.Name, щоб отримати оригінальне ім'я і доповнити його. У блоці set передаємо значення безпосередньо властивості базового класу.

Приховування полів і констант

На відміну від override, new можна застосовувати не тільки до методів і властивостей, але й до полів та констант. Це дозволяє перевизначати статичні метадані класу в ієрархії:

Кожен клас має свою версію констант і полів, незалежну від базового класу. Звернення через тип (Doctor.MinAge) повертає значення саме того класу, через який звертаємось.

Коли використовувати new замість override

Приховування є вузькоспеціалізованим інструментом. Типові сценарії:

  • Метод базового класу не є virtual — якщо немає доступу до вихідного коду або змінювати базовий клас небажано.
  • Навмисна ізоляція поведінки — потрібна різна реалізація залежно від типу змінної (не об'єкта), що є рідкісною але законною архітектурною потребою.
  • Статичні поля та константи — єдиний спосіб «замінити» статичний член у похідному класі.

В усіх інших випадках, де потрібна поліморфна поведінка, слід надавати перевагу virtual + override. Приховування через new без чіткого розуміння наслідків є поширеним джерелом помилок.

Розроблено Tomka Yurii · © 2026 ·