Полное руководство по языку программирования С# 14 и платформе .NET 10 / Объектно-ориентированное программирование

Скрытие методов и свойств

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

В прошлой теме было рассмотрено определение и переопределение виртуальных методов. Другим способом изменить функциональность метода, унаследованного от базового класса, является скрытие (shadowing / hiding).

Фактически скрытие метода/свойства представляет определение в классе-наследнике метода или свойства, которые соответствует по имени и набору параметров методу или свойству базового класса. Для скрытия членов класса применяется ключевое слово new. Например:


class Person
{
	public string Name { get; set; }
	public Person(string name)
    {
        Name = name;
    }
	public void Print()
	{
		Console.WriteLine($"Name: {Name}");
	}
}
class Employee : Person
{
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
	public new void Print()
	{
		Console.WriteLine($"Name: {Name}   Company: {Company}");
	}
}

Здесь определен класс Person, представляющий человека, и класс Employee, представляющий работника предприятия. Employee наследует от Person все свойства и методы. Но в классе Employee кроме унаследованных свойств есть также и собственное свойство Company, которое хранит название компании. И мы хотели бы в методе Print выводить информацию о компании вместе с именем на консоль. Для этого определяется метод Print с ключевым словом new, который скрывает реализацию данного метода из базового класса.

В каких ситуациях можно использовать скрытие? Например, в примере выше метод Print в базовом классе не является виртуальным, мы не можем его переопределить, но, допустим, нас не устраивает его реализация для производного класса, поэтому мы можем воспользоваться сокрытием, чтобы определить нужный нам функционал.

Используем эти классы в программе в методе Main:


Person bob = new Person("Bob");
bob.Print();	// Name: Bob

Employee tom = new Employee("Tom", "Microsoft");
tom.Print();	// Name: Tom  Company: Microsoft

Консольный вывод программы:

Name: Bob
Name: Tom  Company: Microsoft

При этом если мы хотим обратиться именно к реализации свойства или метода в базовом классе, то опять же мы можем использовать ключевое слово base и через него обращаться к функциональности базового класса.


class Employee : Person
{
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
	public new void Print()
	{
		base.Print();	// вызываем метод Print из базового класса Person
		Console.WriteLine($"Company: {Company}");
	}
}

Скрытие свойств

Подобным обазом мы можем организовать скрытие свойств:


Person bob = new Person("Bob");
Console.WriteLine(bob.Name);	// Bob

Employee tom = new Employee("Tom", "Microsoft");
Console.WriteLine(tom.Name);    // Mr./Ms. Tom

class Person
{
	public string Name { get; set; }
	public Person(string name)
    {
        Name = name;
    }
}
class Employee : Person
{
	// скрываем свойство Name базового класса
	public new string Name
	{
		get => $"Mr./Ms. {base.Name}";
		set => base.Name = value;

	}
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
}

В данном случае в классе Employee переопределено свойство Name. В блоке get нем мы берем значение свойства из базовового класса Person и присоединяем к нему "Mr./Ms.". В блоке set передаем полученное значение в реализацию свойства Name базового класса Person

Скрытие переменных и констант

В отличие от переопределения C# позволяет применять скрытие к переменным (как к статическим, так и нестатическим) и константам, также используя ключевое слово new:


Console.WriteLine(Person.minAge);	  // 1
Console.WriteLine(Person.typeName);   // Person

Console.WriteLine(Employee.minAge);		// 18
Console.WriteLine(Employee.typeName);   // Employee

class Person
{
	public readonly static int minAge = 1;
	public const string typeName = "Person";
}
class Employee : Person
{
	// скрываем поля и константы базового класса
	public new readonly static int minAge = 18;
	public new const string typeName = "Employee";
}

Проверь себя

📋 Тест по теме «Скрытие методов и свойств» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class _____
{
	public string Name { get; set; }
	public Person(string name)
    {
        Name = name;
    }
	public void Print()
	{
		Console.WriteLine($"Name: {Name}");
	}
}
class Employee : Person
{
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
	public new void Print()
	{
		Console.WriteLine($"Name: {Name}   Company: {Company}");
	}
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Person _____ = new Person("Bob");
bob.Print();	// Name: Bob

Employee tom = new Employee("Tom", "Microsoft");
tom.Print();	// Name: Tom  Company: Microsoft
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Employee : Person
{
	public string _____ { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
	public new void Print()
	{
		base.Print();	// вызываем метод Print из базового класса Person
		Console.WriteLine($"Company: {Company}");
	}
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ bob = new Person("Bob");
Console.WriteLine(bob.Name);	// Bob

Employee tom = new Employee("Tom", "Microsoft");
Console.WriteLine(tom.Name);    // Mr./Ms. Tom

class Person
{
	public string Name { get; set; }
	public Person(string name)
    {
        Name = name;
    }
}
class Employee : Person
{
	// скрываем свойство Name базового класса
	public new string Name
	{
		get => $"Mr./Ms. {base.Name}";
		set => base.Name = value;

	}
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Console.WriteLine(Person.minAge);	  // _____
Console.WriteLine(Person.typeName);   // Person

Console.WriteLine(Employee.minAge);		// 18
Console.WriteLine(Employee.typeName);   // Employee

class Person
{
	public readonly static int minAge = 1;
	public const string typeName = "Person";
}
class Employee : Person
{
	// скрываем поля и константы базового класса
	public new readonly static int minAge = 18;
	public new const string typeName = "Employee";
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

class Person
{
	public string _____ { get; set; }
	public Person(string name)
    {
        Name = name;
    }
	public void Print()
	{
		Console.WriteLine($"Name: {Name}");
	}
}
class _____ : Person
{
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
	public new void Print()
	{
		Console.WriteLine($"Name: {Name}   Company: {Company}");
	}
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

_____ bob = new Person("Bob");
bob.Print();	// _____: Bob

Employee tom = new Employee("Tom", "Microsoft");
tom.Print();	// Name: Tom  Company: Microsoft
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

bob.Print();	// Name: Bob
Employee tom = new Employee("Tom", "Microsoft");
tom.Print();	// Name: Tom  Company: Microsoft
Person bob = new Person("Bob");
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Скрытие методов и свойств»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Скрытие методов и свойств», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

class Person
{
	public string Name { get; set; }
	public Person(string name)
    {
        Name = name;
    }
	public void Print()
	{
		Console.WriteLine($"Name: {Name}");
	}
}
class Employee : Person
{
	public string Company { get; set; }
	public Employee(string name, string company)
				: base(name)
	{
		Company = company;
	}
	public new void Print()
	{
		Console.WriteLine($"Name: {Name}   Company: {Company}");
	}
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Скрытие методов и свойств»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

Person bob = new Person("Bob");
bob.Print();	// Name: Bob

Employee tom = new Employee("Tom", "Microsoft");
tom.Print();	// Name: Tom  Company: Microsoft
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Скрытие методов и свойств»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Скрытие методов и свойств»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Скрытие методов и свойств». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.