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



请考虑以下示例。

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 方法?我的理解是,使用接口,人们只能访问接口所包含的方法。

你的类隐式派生自System.Object

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

更新:

刚发现这个,可能重复?

接口是否派生自 System.Object?C# 规范说是,Eric 说不,现实说不<</p>

div class="ans>

因为一切都是对象。 这是一个芝士球答案,但这就是 .NET 的工作方式。:)

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

实际上,使用接口,您可以访问接口包含的方法System.Object的所有成员(正如您所发现的那样)。这并不意味着接口本身派生自System.Object,它只是意味着编译器在检查声明为接口的变量上的成员时有一个"特殊情况"。

编译器可以这样做,因为接口是由对象实现的,并且所有对象都派生自System.Object

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

最新更新