C# 为什么接口实例有GetType、GetHashCode、Equals和ToString方法?
考虑下面的例子C# 为什么接口实例有GetType、GetHashCode、Equals和ToString方法?,c#,object,interface,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
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中的字符串方法?我的理解是,有了接口,人们只能访问接口所拥有的方法。因为一切都是对象。这是一个简单的答案,但.NET就是这样工作的 您的类隐式派生自
System.Object
:
语言通常不需要类来声明对象的继承,因为继承是隐式的。[]
更新:
刚找到这个,可能是重复的
我的理解是,有了接口,人们只能访问方法
接口保持不变
实际上,通过一个接口,您可以访问接口持有的方法和System.Object
的所有成员(如您所发现的)。这并不意味着接口本身派生自System.Object
,它只是意味着编译器在检查声明为接口的变量上的成员时有一个“特殊情况”
编译器可以这样做,因为接口是由对象实现的,所有对象都派生自System.Object
因此,当
a
被声明为IAnimal
时,实际上意味着变量a
包含一个实现接口IAnimal
的对象。此对象保证支持IAnimal中的所有成员以及系统中的所有成员。对象我认为您将概念与语言功能混为一谈。所有东西都是从object派生的。即使你的类继承了object之外的东西,我想你的接口只知道它的契约的成员?@Michael你说得对,接口不继承object。对象类中的方法可通过成员查找获得。检查上面的链接。@har07是的,Eric对这个问题的回答很好。但是,我想知道在编译过程中会发生什么事情来插入接口实例以获得其他方法。即使在ILDASM中打开接口时,我们也不会看到这些。我将寻找成员查找:)@Prasanna这也是我的观点。编译器甚至没有告诉您直接继承,更不用说间接继承了。然而,编译器和智能能够做到。@Michael你们都提到了JIT编译器吗?因为,在dis汇编程序中看到接口时,我没有看到任何变化。奇怪的是,我看到了以下内容:。类接口公共抽象自动ansi算术.IAnimal{}//类结束算术.IAnimal??