请考虑以下示例。
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>
因为一切都是对象。 这是一个芝士球答案,但这就是 .NET 的工作方式。:)
我的理解是,使用接口,只能访问方法接口保持。
实际上,使用接口,您可以访问接口包含的方法和System.Object
的所有成员(正如您所发现的那样)。这并不意味着接口本身派生自System.Object
,它只是意味着编译器在检查声明为接口的变量上的成员时有一个"特殊情况"。
编译器可以这样做,因为接口是由对象实现的,并且所有对象都派生自System.Object
。
因此,当a
声明为 IAnimal
时,它实际上意味着变量 a
包含一个实现接口 IAnimal
的对象。此对象保证支持 IAnimal
中的所有成员和 System.Object
中的所有成员。