Введение

Некоторые сценарии требуют, чтобы виртуальные методы были переопределены в дочерних классах, к примеру, требование переопределить 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