Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 06.01.2020
Сообщений: 76

В чём различие переопределения и сокрытия методов?

10.05.2020, 16:02. Показов 3873. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Например дан код:
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Person
{
    public string Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
    public virtual void Display()
    {
        Console.WriteLine(Name);
    }
}
class Employee : Person
{
    public string Company { get; set; }
    public Employee(string name, string company)
        : base(name)
    {
        Company = company;
    }
 
    public override void Display()
    {
        Console.WriteLine($"{Name} работает в {Company}");
    }
}
 
Person tom = new Employee("Tom", "Microsoft");
tom.Display();
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Person
{
    public string Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
 
    public void Display()
    {
        Console.WriteLine(Name);
    }
}
 
class Employee : Person
{
    public string Company { get; set; }
    public Employee(string name, string company)
            : base(name)
    {
        Company = company;
    }
    public new void Display()
    {
        Console.WriteLine($"{Name} работает в {Company}");
    }
 
Person tom = new Employee("Tom", "Microsoft");
tom.Display();
}
В первом случае будет выводиться: "Tom работает в Microsoft", а во втором просто "Tom". Почему так?
Так же в примере почему то
C# Скопировано
1
2
Person tom = new Employee("Tom", "Microsoft");
tom.Display();
, зачем? Меня учили что надо писать например
C# Скопировано
1
Person tom = new Person();
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2020, 16:02
Ответы с готовыми решениями:

Отличия переопределения от сокрытия имен
Помогите разложить знания по полочкам. Фактической разницы, честно сказать, не увидел. То есть разницы для выполнения задачи. Как я...

Как работается механизм переопределения методов в наследниках?
Добрый день! Помогите разобраться. using System; namespace Test { class Program { static void Main(string...

Более правильный способ «динамического» переопределения виртуальных методов?
Требуется у объекта переопределять виртуальные методы, но не на этапе компиляции, а в рантайме (весело, да? :D). Ничего не пришло в...

2
Эксперт .NET
 Аватар для kolorotur
17810 / 12961 / 3381
Регистрация: 17.09.2011
Сообщений: 21,250
10.05.2020, 16:27
Цитата Сообщение от Shinsengumi Посмотреть сообщение
В чём различие переопределения и сокрытия методов?
Переопределенный метод вызывается в зависимости от фактического типа объекта.
Скрытый метод вызывается (или не вызывается) в зависимости от типа переменной или статически известного типа ссылки.

Цитата Сообщение от Shinsengumi Посмотреть сообщение
Почему так?
Потому что скрытый метод вызывается только тогда, когда переменная/значение имеет тот же тип, в котором этот метод скрыт.

Цитата Сообщение от Shinsengumi Посмотреть сообщение
зачем?
Затем, что код может выглядеть и так:
C# Скопировано
1
2
3
4
5
6
Person p = GetSomePerson();
 
Person GetSomePerson()
{
  // Здесь могут возвращаться экземпляры разных наследников.
}
0
 Аватар для Enifan
1844 / 1186 / 501
Регистрация: 14.10.2018
Сообщений: 3,184
10.05.2020, 17:13
Лучший ответ Сообщение было отмечено Shinsengumi как решение

Решение

Цитата Сообщение от Shinsengumi Посмотреть сообщение
Меня учили что надо писать
Писать можно так, как вам нужно, все дело в полиморфизме - одна из составляющих частей ООП
Цитата Сообщение от Shinsengumi Посмотреть сообщение
"Tom работает в Microsoft", а во втором просто "Tom". Почему так?
Полиморфизм
Прежде чем отвечать поясню как он работает. У нас есть 2 вещи - ссылка и объект.
C# Скопировано
1
2
Person tom = new Person();   // 1-ый пример
Person tom = new Employee(); // 2-ой пример
В 1-ом примере ссылка типа Person и объект типа Person
Во 2-ом примере ссылка типа Person и объект типа Employee
Ссылки базового класса могут ссылаться на объекты производных классов - это и есть полиморфизм.
Но в чем разница? Если по 1-му примеру вопросов нет, то по 2-ом ответ таков: вы все также работаете с классом Employee, только с одним исключением - вызывать методы и данные можно только те, что есть в классе Person. Поле Name и свойство Display() - пожалуйста, поле Company - увы нельзя, почему так? Потому что ссылка Person не знает что такое поле существует. А какой из методов Display() будет вызван? Только тот, о котором ссылка Person знает, то бишь - базового класса. Однако эту проблему можно решить с помощью переопределения.
Переопределение данных
Ключевые слова virtual в базовом классе и override в классе наследнике отвечают за переопределение данных / методов. Если прописать эти 2 слова к методам Display() обоих классов, то результат работы этого метода при полиморфизме изменится. Возвращаемся к примеру
C# Скопировано
1
2
Person tom = new Employee();
tom.Display();
Как ведет себя компилятор в этом случаи? Он видит что метод Display() помечен словом virtual, и начинает спускаться вниз по цепочке наследования от класса Person до класса Employee, если он встречает такой же метод со словом override, он он будет использовать именно эту версию метода. При длинной цепочке наследования (например в 10 классов) если хотя бы 1 класс не использует override, то будет вызван последний override-метод этой иерархии
Скрытие данных
Скрытие данных происходит с помощью слова new, если его нет - то компилятор сделает это сам, однако Visual Studio выдаст предупреждение (не ошибку). С помощью слова new вы делаете это явно (скажем так - это хороший стиль программирования и читать код проще). Скрытие данных полностью отрубает переопределение данных. Создается (в вашем случаи) новый метод, который называется точно также, как и в базовом классе. Можете рассматривать это примерно так - есть метод Display() и есть метод Display_1(). Они никак друг друга не касаются. Зачем это нужно? Когда вы называете переменную string Name - вы даете четкое понимание это это переменная хранит имя. В классе наследнике надо создать новую переменную (именно новую, при этом старая тоже нужна) и назвать ее точно также название Name. Как быть - скрыть старую.
Еще одно отличие при скрытии данных - в вашем случаи будет создано два метода Display(), не смотря на то, что они имеют одинаковые названия.
Также можно вызвать метод наследника с помощью слова base.Display() внутри метода Display() класса Employee.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2020, 17:13
Помогаю со студенческими работами здесь

Для достижения перегрузки и переопределения трех методов (использование класса с другим классом вариантов)
необходимо создать объект класса "Текст", используя класс "страницы"

В чем различие?
Подскажите, пожалуйста, чем отличается машинное представление переменной типа Real от представления всех других типов вещественных...

В чем различие?
В чем состоит отличия интерфейсов прикладного программиста операционной системы от интерфейса системного программиста реальной аппаратуры

В чем различие?
Node * pbeg = first(1); В чем различие между Node *pend = pbeg; и Node *pend = *pbeg;

в чем различие подскажите
Есть капча и ссылка обновить: <img id="protect_code" src="/classes/images/protect_image.php" class="protect_image"> <a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть. Дело в том, что я. . .
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер