2009-08-22 19 views
1

.NET中確實有全部類型繼承自System.Object。System.Object如何使用子類作爲其返回類型?

我發現矛盾,是對System.Object的幾個方法 - )即

  • 公共虛擬的ToString(;
  • public virtual bool Equals(object objA,object objB);

System.String是從System.Object繼承:

[Serializable] 
public class String : Object { /*...*/ } 

System.Boolean從System.Object中繼承:

[Serializable] 
public struct Boolean : Object { /*....*/ } 

是什麼,允許在幕後的事情System.Object類允許子類用作其方法的返回類型?這個代碼是如何編譯的,因爲似乎有一個循環引用。字符串< - >對象< - >布爾值。我確定我會看到關於「它是如何實現的」語句,但是我可以理解這些返回類型是否是「System.Object」本身,然後是子類使用實現的string,bool和其他System.ValueTypes聲明一個新的基類。

我希望這是有道理的。

由於提前,

多米尼克

回答

7

這沒什麼大不了的,基類總是可以參考的子類。例如,該代碼完全合法:

class A 
{ 
    public B CreateB(); 
    { 
     return new B(); 
    } 
} 

class B : A 
{ 
} 

。注意,是如果A和B在單獨的組件中定義的一個問題,因爲這將需要一個圓形裝配參考,這是不允許的

+0

你可能想看看http://stackoverflow.com/questions/1316518/how-did-microsoft-create-assemblies-that-have-circular-references在那裏表明,儘管圓形依賴關係被IDE阻止,它們可以使用命令行編譯器(csc.exe)完成。 – 2009-08-22 18:09:07

+0

我的意思是程序集之間的循環依賴關係... – 2009-08-22 18:11:20

0

我沒有看到基類返回派生類的問題。

此外,我沒有看到循環依賴關係,因爲Object.ToString();返回一個String對象。 String類從對象派生,但是又如何呢?如果兩者都在同一個組件中,則沒有問題。

+0

這更像是一個雞/雞蛋的情況,這是什麼使我困惑? – 2009-09-22 08:52:17

2

循環引用只是跨多個項目的一個問題,否則父/子關係在任何時候都不會存在。

2

實際上,它是而不是完全正確,所有類型都從Object繼承。請參閱Eric Lippert的blog entry on this

0

除了其他人所說的之外,您還可以從使用派生類作爲泛型類型參數的基類中派生類。這種模式有很多巧妙的用途。

public class A<T> 
{ 
} 

public class B : A<B> 
{ 
} 
相關問題