为什么接口实例有GetType,GetHashCode,Equals和ToString方法?

时间:2014-02-25 05:47:48

标签: c# object interface

考虑以下示例。

public interface IAnimal
{
   void MakeSound();
}
public class Dog: IAnimal
{
   public void MakeSound() { Console.WriteLine("Bow-Bow-Bow"); } 
   public static void Main()
   {
      IAnimal a = new Dog();
      Console.WriteLine(a.MakeSound());
      Console.WriteLine(a.ToString());
   }
}

接口实例如何访问来自System.Object的ToString方法?我的理解是,通过接口,人们只能访问接口所持有的方法。

3 个答案:

答案 0 :(得分:4)

您的类隐式派生自System.Object

  

语言通常不需要类来声明从Object继承,因为继承是隐式的。 [MSDN]

更新:

刚发现这个,可能重复? :

Do interfaces derive from System.Object? C# spec says yes, Eric says no, reality says no

答案 1 :(得分:2)

因为 所有内容 是一个对象。这是一个赛狗的答案,但这就是.NET的工作原理。 :)

答案 2 :(得分:0)

我的理解是,使用接口,只能访问方法 接口成立。

实际上,通过一个接口,您可以访问该接口包含{em>和 System.Object的所有成员的方法(如您所知)。这并不意味着接口本身是从System.Object派生出来的,仅意味着在检查声明为接口的变量上的成员时,编译器具有“特殊情况”。

编译器可以执行此操作,因为接口是由对象实现的,并且所有对象都来自System.Object

因此,将a声明为IAnimal时,实际上意味着变量a包含一个实现接口IAnimal的对象。确保该对象支持IAnimal 所有成员System.Object中的所有成员。