Почему я могу переопределить метод 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, поэтому вы будете переопределять этот метод здесь.