Принудительное переопределение виртуальных методов - Блог ITVDN
ITVDN: курсы программирования
Видеокурсы по
программированию

Выбери свою IT специальность

Подписка

Принудительное переопределение виртуальных методов

advertisement advertisement

Введение

Некоторые сценарии требуют, чтобы виртуальные методы были переопределены в дочерних классах, к примеру, требование переопределить GetHashCode и Equals. В этом примере будет описано, как применять подобное переопределение.


Виртуальные и абстрактные методы

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

Могут встретиться ситуации, когда необходимо обеспечить перезапись виртуальных методов дочерним классом, не используя определение этого метода в материнском классе. Это имеет смысл, когда необходимо переопределить виртуальный метод в пользовательском классе или стандартные методы .NET framework.

Одним из наиболее простых примеров этой техники является принудительное переопределение методов ToStringEquals и GetHashCode, которые определены в классе System.Object. Это возможно сделать наряду с перегрузкой оператора == для того, чтобы убедиться, что метод Equals не использует банальное сравнение равенства ссылок для Вашего приложения. Для корректной работы необходимо, чтобы методы Equals и GetHashCode были переопределены. Можно также переопределить и ToString для того, чтобы иметь возможность включить важную информацию для использования во время ведения учета записей.

Для того, чтобы убедиться в переопределении методов в классах, дочерних от абстрактного класса DataObject, необходимо переопределить их в этих классах. Также необходимо отметить новые методы как абстрактные.

Например:

public abstract class DataObject

{

    public abstract override string ToString();

    public abstract override bool Equals(objectobj);

    public abstract override int GetHashCode();

}

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

public class Employee : DataObject

{

}

При построении проекта будет сгенерировано сообщение об ошибке для каждого «потерянного» метода. В сообщениях будет описание проблемы и выглядеть оно будет следующим образом:

'ConsoleApplication1.Employee' does not implement inherited abstract member

'ConsoleApplication1.DataObject.GetHashCode()'

Источник: http://www.blackwasp.co.uk/ForcedOverride.aspx

КОММЕНТАРИИ И ОБСУЖДЕНИЯ
advertisement advertisement

Покупай подпискус доступом ко всем курсам и сервисам

Библиотека современных IT знаний в удобном формате

Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.

Стартовый
  • Все видеокурсы на 3 месяца
  • Тестирование по 10 курсам
  • Проверка 5 домашних заданий
  • Консультация с тренером 30 мин
59.99 $
Оформить подписку
Пакет Black Friday
  • Все видеокурсы на 15 месяцев
  • Тестирование по 24 курсам
  • Проверка 20 домашних заданий
  • Консультация с тренером 120 мин
  • Скачивание видео уроков
  • Возможность приостановки обучения
110.00 $
220.00 $
Оформить подписку
Акция
Базовый
  • Все видеокурсы на 1 год
  • Тестирование по 16 курсам
  • Проверка 10 домашних заданий
  • Консультация с тренером 60 мин
89.99 $
Оформить подписку
Notification success