2014-02-25 69 views
2

考慮下面的例子。接口實例如何獲得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方法?我的理解是,通過接口,只能訪問接口所擁有的方法。

+0

我認爲你正在將一個概念與語言特性混合在一起。 – Muctadir

回答

4

你的類隱式地從System.Object得出:

語言通常不要求類從申報對象繼承,因爲繼承是隱含的。 [MSDN]

UPDATE:

剛剛發現這一點,可以複製? :

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

+0

即使你的類繼承了對象,我認爲你的接口只會知道它的合約的成員? –

+0

@Michael你是對的,接口不會繼承對象。來自Object類的方法可以通過* member lookup *獲得。檢查上面的鏈接。 – har07

+1

@ har07是的,Eric的回答在這個問題上很好。但是,我想知道在編譯過程中會發生什麼,以便將接口實例插入到其他方法中。即使我們在ILDASM中打開界面時也不會看到這些內容。我會尋找會員查找:) – Prasanna

2

因爲所有東西是一個對象。這是一個奶酪球的答案,但這就是.NET的工作原理。 :)

+1

[不](http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx)一切從對象導出。 – Junaith

相關問題