Почему я могу переопределить метод Equals, если мой класс не наследует ничего?
Я немного запутался, как работает следующий код
public class DefaultClass
{
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
Мой вопрос: я не наследую какой-либо класс, но как я могу переопределить метод Equals. Этот код отлично компилируется в VS2010. Любая идея, как это работает?
Ответы
Ответ 1
Поскольку ваш DefaultClass
'наследует' от object
по умолчанию.
Теперь вы переопределяете object.Equals
.
Я понимаю путаницу. MSDN говорит, что такой класс не наследует какой-либо другой класс, но он делает (object
):
Наследование: нет. Пример: class ClassA { }
Ответ 2
Класс объекта является родительским классом для всех классов и всех классов, наследуемых от него. Таким образом, ваш Default Class
также наследует класс Object
Это конечный базовый класс всех классов в .NET Framework; это корень иерархии типов.
Это можно понять с помощью древовидной структуры:
System.Object
/ \
/ \
/ \
SomeProject.DefaultClass SomeProject.SomeOtherBaseClass
/ \
/ \
/ \
SomeProject.ChildClass1 SomeProject.ChildClass2
На стороне примечания также проверьте эту очень актуальную статью Эрика Липперта, которая может помочь вам в понимании класса Object: - Не все происходит от объекта
Ответ 3
System.Object - это базовый класс всех классов в .NET Framework; это корень иерархии типов.
Таким образом, весь класс может переопределить метод, определенный в этом классе.
Методами, определенными в классе System.Object, являются Equals(), Finalize(), GetHashCode() и ToString().
Ответ 4
Ваше понимание того, что вы не наследуете ни один класс, неверно.
Смотрите: Object.Equals Method (Object) - MSDN
Поскольку класс Object является базовым классом для всех типов в .NET Framework, метод Object.Equals(Object)
предоставляет сравнение равенства по умолчанию для всех других типов. Однако типы часто переопределяют метод Equals для реализации равенства значений.
Но не забудьте прочитать: Не все происходит от объекта - Эрик Липперт
Ответ 5
Ваш класс по умолчанию наследует Object Класс. Это конечный базовый класс всех классов в .NET Framework; это корень иерархии типов.
Вот почему вы можете переопределить свои методы.
Поскольку все классы в .NET Framework являются производными от Object, каждый метод, определенный в классе Object, доступен для всех объектов в системе. Производные классы могут и могут переопределять некоторые из этих методов, включая:
-
Equals
- Поддерживает сравнение между объектами.
-
Finalize
- Выполняет операции очистки перед тем, как объект будет автоматически восстановлен.
-
GetHashCode
- генерирует число, соответствующее значению объекта для поддержки использования хеш-таблицы.
-
ToString
- Создает удобочитаемую текстовую строку, описывающую экземпляр класса.
Ответ 6
Класс объекта является базовым классом для всех классов, определенных пользователем, так как вы создали класс с именем DefaultClass, это будет подкласс для класса Object. Таким образом, метод Equals() уже определен в классе Object, поэтому вы будете переопределять этот метод здесь.