我有点糊涂了下面的代码是如何工作的为什么我能够覆盖Equals方法,如果我的类不从任何东西继承?
public class DefaultClass
{
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
我的问题是:我没有继承任何类,不过为什么我仍然能够重写equals方法。此代码在VS2010中完美编译。任何想法如何工作?
我有点糊涂了下面的代码是如何工作的为什么我能够覆盖Equals方法,如果我的类不从任何东西继承?
public class DefaultClass
{
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
我的问题是:我没有继承任何类,不过为什么我仍然能够重写equals方法。此代码在VS2010中完美编译。任何想法如何工作?
因为默认情况下,您的DefaultClass
“继承”object
。
你现在压倒object.Equals
。
虽然我明白这个困惑。 MSDN表示这样的类不会继承任何其他类,但它确实(object
):
继承:无。例如:
class ClassA { }
只是为了清晰起见,C#中的所有类型都从父类Object继承,这就是为什么您可以引用任何ref或value的所有实例到对象。 – Liran 2014-09-11 12:49:45
@Liran [并非所有事情都来自于对象。](http:// blogs。msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx) – 2014-09-11 15:00:55
根据ECMA规范,除'Enum'之外的每个'Type'都来自'ValueType'有效地定义存储位置类型和堆对象类型。堆对象类型派生自Object,存储位置类型可转换为Object,但存储位置类型不会从ECMA规范术语中的对象继承[这意味着如果X继承从Y开始,类型X的值或对类型X的对象的引用必须直接用作类型Y的值,而不需要任何表示更改转换。 – supercat 2014-09-11 15:54:32
Object class是用于所有类的父类,所有的类继承它。因此,您的Default Class
也继承了Object
类
这是.NET Framework中所有类的最终基类; 它是类型层次结构的根。
这可以使用一个树状结构的理解:
System.Object
/ \
/ \
/ \
SomeProject.DefaultClass SomeProject.SomeOtherBaseClass
/ \
/ \
/ \
SomeProject.ChildClass1 SomeProject.ChildClass2
在一个侧面说明还做检查由埃里克利珀此十分相关文章可以帮助你理解Object类: - Not everything derives from object
您的默认类继承自Object类。这是.NET Framework中所有类的最终基类;它是类型层次结构的根。
这就是您可以覆盖其方法的原因。
由于.NET Framework中的所有类都是从Object派生的,因此Object类中定义的每个方法都可用于系统中的所有对象。派生类可以并且可以覆盖其中的一些方法,包括:
Equals
- 支持对象之间的比较。Finalize
- 在自动回收对象之前执行清理操作。GetHashCode
- 根据对象的值生成一个数字,以支持使用散列表。ToString
- 制作描述类的实例的人类可读文本字符串。对象类是所有用户定义的类的基类,如要为对象类创建一个名为DefaultClass类,这将通过子类。所以Equals()方法已经在Object类中定义了,因此您将在此重写此方法。
System.Object是.NET Framework中所有类的最终基类;它是类型层次结构的根。
因此,所有的类都可以覆盖此类中定义的方法。 在System.Object类中定义的方法是Equals(),Finalize(),GetHashCode()和ToString()。
你的理解,你不是从任何一个班级继承是不正确的。
参见:Object.Equals Method (Object) - MSDN
由于Object类是在 .NET框架所有类型的基类,所述
Object.Equals(Object)
方法提供了用于所有其它类型的 默认相等比较。但是,类型 通常会覆盖等于方法以实现值相等。
_ “如果我的类不从任何继承?” _你是在错误的轨道上,因为([近](HTTP://博客。 msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx))每个类都从Object继承。 – 2014-09-11 12:34:17
@TimSchmelter:关闭 - 每个类都*从* Object继承。像接口和指针这样的东西不会继承,因为它们不是类。 – Gabe 2014-09-11 12:49:57
@加贝:是的,用类型替换类,_nearly_是正确的。但是,不仅类从对象派生,而且还有像'struct'或'enum'这样的值类型。 – 2014-09-11 13:03:29