如果我的班级不从任何东西继承,为什么我能够覆盖Equals方法?

时间:2014-09-11 12:25:43

标签: c# .net oop inheritance

我对以下代码如何工作感到有点困惑

public class DefaultClass
{
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
}

我的问题是:我不是继承任何类,但我仍然可以覆盖Equals方法。此代码在VS2010中完美编译。知道这是如何工作的吗?

6 个答案:

答案 0 :(得分:32)

因为您的DefaultClass'默认继承自object

您现在正在覆盖object.Equals

我理解这种困惑。 MSDN说像这样的类不会继承任何其他类,但确实如此(object):

  

继承:无。示例:class ClassA { }

答案 1 :(得分:9)

Object class是所有类的父类,所有类都继承自它。因此,您的Default Class也会继承Object

  

这是.NET Framework中所有类的最终基类;   它是类型层次结构的根。

您可以使用树形结构来理解这一点:

                     System.Object
                     /           \
                    /             \
                   /               \
SomeProject.DefaultClass        SomeProject.SomeOtherBaseClass
                                         /           \
                                        /             \
                                       /               \
                   SomeProject.ChildClass1       SomeProject.ChildClass2

另外,请查看Eric Lippert撰写的这篇非常相关的文章,它可以帮助您理解Object类: - Not everything derives from object

答案 2 :(得分:2)

System.Object是.NET Framework中所有类的最终基类;它是类型层次结构的根。

因此,所有类都可以覆盖此类中定义的方法。 System.Object类中定义的方法是Equals(),Finalize(),GetHashCode()和ToString()。

答案 3 :(得分:2)

你的理解是你不是从任何一个班级继承是不对的。

请参阅:Object.Equals Method (Object) - MSDN

  

因为 Object类是所有类型的基类   .NET Framework Object.Equals(Object)方法提供了   所有其他类型的默认相等比较。但是,类型   经常覆盖Equals方法以实现值相等。

但是,请记得阅读:Not everything derives from object - Eric Lippert

答案 4 :(得分:1)

您的默认类继承自Object类。这是.NET Framework中所有类的最终基类;它是类型层次结构的根。

这就是你可以覆盖其方法的原因。

因为.NET Framework中的所有类都是从Object派生的,所以Object类中定义的每个方法都可以在系统中的所有对象中使用。派生类可以并且确实覆盖其中一些方法,包括:

  • Equals - 支持对象之间的比较。
  • Finalize - 在自动回收对象之前执行清理操作。
  • GetHashCode - 生成与对象值对应的数字,以支持使用哈希表。
  • ToString - 制作一个描述该类实例的人类可读文本字符串。

答案 5 :(得分:1)

Object Class是所有用户定义类的基类,因为您创建了一个名为 DefaultClass 的类,这将由Object类的子类创建。因此,Equals()方法已在Object类中定义,因此您将在此处覆盖此方法。