簡體   English   中英

c#中這兩個變量賦值有什么區別?

[英]What is the difference between these two variable assignments in c#?

這兩個任務有什么區別? A 繼承自 Base。

Base b = new A();
A c = new A();

如果第二個聲明為類型 A,我不明白為什么會這樣。

List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);

我應該查找什么才能更了解這一點?

繼承構成了一個is關系:如果A繼承了Base ,則意味着A可以去任何允許Base去的地方。 這正是你的代碼段顯示:您可以添加的實例A ,的一個子類BaseList<Base>其中的任何子Base可以走了。

這是因為繼承是可傳遞的。 正如 MSDN 所說

如果 ClassC 派生自 ClassB,而 ClassB 派生自 ClassA,則 ClassC 繼承在 ClassB 和 ClassA 中聲明的成員。

因此,在您的情況下,由於A繼承自Base ,因此A "is-a" Base可以添加到List<Base> 該列表的每個元素都是一個Base

這兩個陳述對我來說很清楚。 因為在第一個中,我們有一個原始對象 Base,它像一個特化一樣被實例化。 在第二個中, A 像它自己的類型一樣被實例化。 您必須記住的是,A 類型也是 Base 類型。 此功能稱為多態性。 您可以在http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming 中閱讀更多內容

當您將 C 添加到 vals 時,編譯器會自動將 c 強制轉換為 OOP 中的 Base -> 從子級轉換到父級 => 沒關系

Base b = new A(); 

由於 A 實現 Base 這是有效的。

b 將只有 Base 的屬性和方法。

但不同之處在於您可以將 b 強制轉換為 A,然后使用 A 的屬性和方法。

這些關於繼承的問題是 C# 和任何面向對象語言的基礎。 你應該從一本好書Pro C# 5.0 and the .NET 4.5 Framework, Sixth Edition或一些免費的在線教程開始,比如Microsoft C# 教程或這里c#它們無處不在......如果你認真學習並且喜歡教學視頻。 訪問 www.pluralsight.com 以大約 30 美元/月的價格獲得專家制作的一些精彩視頻。 您可以以 50 美元/月的價格下載練習。

回到你的問題。 生病交換A和B

//Base Class A is Animal.  Class B might be a Bird. 
Animal A = new bird();   // but A has visibility of or can access the features common to all animals Ie access a bird but with a narrower view.
Bird C  = new Bird() ; works for the obvious reason. 

but thats just the beginning...

您需要考慮抽象和虛擬類和屬性。 覆蓋屬性。 由於您的示例有一個列表,您甚至可能會遇到 COVARIANCE 問題。

實際上跳到了深處...... http://msdn.microsoft.com/en-us/vstudio/ee672314協方差和逆變。 只為嘗一口。

最近(在過去的 12 個月內)學習了 c#,如果您是認真的,我建議您按照上述建議的方式閱讀本書或視頻課程。 如果您搜索,您會發現大量有關 c# 問題的信息。

如果你是一個偶然的興趣,那么我不知道該建議什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM