说在,开篇之前
在.NET世界里,我们常常听到的一句话莫过于“System.Object是一切类型的根,是所有类型的父类”,以至于我在《你必须知道的.NET》8.1节 以“万物归宗:System.Object”这样的title为System.Object授予至高荣誉。所以,基于这样的观点就有了下面这句“接口是否也继承于System.Object?”,事实上这正是今天在技术群里小小讨论的一个插曲。
1 缘起
在.NET世界里,我们常常听到的一句话莫过于“System.Object是一切类型的根,是所有类型的父类”,以至于我在《你必须知道的.NET》8.1节 以“万物归宗:System.Object”这样的title为System.Object授予至高荣誉。所以,基于这样的观点就有了下面这句“接口是否也继承于System.Object?”,事实上这正是今天在技术群里小小讨论的一个插曲。
持“interface也继承于object”,是基于以下的两个观点推断的:
观点一:
接口本质上也是一个class,因为接口类型编译之后在IL中被标识为.class,既然是类那么不可避免的最终继承于System.Object。
观点二:
假如有如下的接口和实现接口的类型:
// Release : code01, 2009/03/04
// Author : Anytao, http://www.anytao.com
// List : IObjectable.cs
public interface IObjectable
{
}
// Release : code02, 2009/03/04
// Author : Anytao, http://www.anytao.com
// List : MyObject.cs
public class MyObject : IObjectable
{
}
那么,对于IObjectable对象而言,下面的调用是可行的:
// Release : code03, 2009/03/04
// Author : Anytao, http://www.anytao.com
// List : Program.cs
class Program
{
static void Main(string[] args)
{
IObjectable obj = new MyObject();
//Call Object instance methods
obj.ToString();
//Call Object static methods
IObjectable.Equals(null, null);
}
}
显然,IObjectable类型变量obj可以访问存在于System.Object中的实例方法ToString()和虚方法Equals,当然其他的几个公共服务也不例外:GetType()、Equals()、GetHashcode()、ReferenceEquals(),也可以由此推断interface可访问Object方法的蛛丝马迹。
不可否认,以上观点的部分推理是完全正确的,但是却遗憾的导致了错误的答案,所以在本文中我将明确的找出:interface不继承于object的原因和原理。关于接口本质话题的深度讨论,请参考《你必须知道的.NET》1.5 “玩转接口”和7.4 “面向抽象编程:接口和抽象类”的详细分析。