Підрозділ 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.

Приховування властивостей
Так само як і методи, можна приховувати властивості. Це корисно, коли потрібно змінити логіку доступу у похідному класі без оголошення virtual у базовому:
У блоці get звертаємось до base.Name, щоб отримати оригінальне ім'я і доповнити його. У блоці set передаємо значення безпосередньо властивості базового класу.
Приховування полів і констант
На відміну від override, new можна застосовувати не тільки до методів і властивостей, але й до полів та констант. Це дозволяє перевизначати статичні метадані класу в ієрархії:
Кожен клас має свою версію констант і полів, незалежну від базового класу. Звернення через тип (Doctor.MinAge) повертає значення саме того класу, через який звертаємось.
Коли використовувати new замість override
Приховування є вузькоспеціалізованим інструментом. Типові сценарії:
- Метод базового класу не є
virtual— якщо немає доступу до вихідного коду або змінювати базовий клас небажано. - Навмисна ізоляція поведінки — потрібна різна реалізація залежно від типу змінної (не об'єкта), що є рідкісною але законною архітектурною потребою.
- Статичні поля та константи — єдиний спосіб «замінити» статичний член у похідному класі.
В усіх інших випадках, де потрібна поліморфна поведінка, слід надавати перевагу virtual + override. Приховування через new без чіткого розуміння наслідків є поширеним джерелом помилок.