簡體   English   中英

抽象類的對象和抽象類的對象列表之間有什么區別?

[英]What is the difference between object of an abstract class and list of objects of abstract class?

我們不能創建抽象類的對象,但我們可以創建List或它們的數組。 有什么不同?

列表或數組只是一組指針的占位符,您還沒有創建任何實例。

當你說創建對象 - 你的意思是創建一個實例 - 你不能用抽象類。

但是你可以創建指向它們的列表或數組(並且是EMPTY) - 然后你可以將指針移動到派生類/對象的“真實”實例

答案摘要:

List或數組本身不是一個抽象類,即使它聲明它將保存的類型一個抽象類。

更詳細的答案:

即使你不能創建一個抽象類的對象(“of”這個詞有些模糊,但顯然你的意思是作為該類的直接實例化),你可以創建一個對象,它是一個抽象類的實例 (因為它是擴展所述抽象類的具體類的實例。

基本上,給定抽象類Abstraction ,以及擴展Abstraction具體類ConcreteList<Abstraction>意味着你可以在其中的任何東西,它是擴展Abstraction的東西的實例,例如Concrete的實例。 雖然數組在某些方面與列表有點不同,但同樣也適用於它們。

例:

鑒於此類:

public abstract class Abstraction {

}

而這堂課:

public class Concrete : Abstraction {

}

你不能這樣做:

Abstraction a = new Abstraction();

但你可以這樣做:

Abstraction a = new Concrete();

然后你可以這樣做:

IList<Abstraction> list = new List();
list.add(a);

可以聲明並初始化一個列表,其中成員的類型是抽象類,因為要創建此對象,您不需要實際實例化抽象類。

從邏輯上講,列表只是指針的容器。

例如,您可以定義抽象類的列表,但此列表可以在開頭為空。

您也可以使用初始大小初始化列表,但在開始時它不包含對實際對象的引用:初始化將僅為指針預分配空間。

添加到列表中的對象必須是擴展抽象類的具體類的實例。

由於顯而易見的原因,您無法創建抽象類的實例,但無論T是抽象類,都必須創建List<T>類的實例。

讓抽象類稱為ClassAbstract

  • 當您嘗試執行new ClassAbstract() ,您嘗試創建ClassAbstract的對象。
  • 當你這樣做 - new List<ClassAbstract>() ,你創建List<T>對象。

List是空的!

這意味着沒有abstract類的實例。

允許創建一個空列表。 您可以(稍后)向其添加一個擴展它的non abstract類。

我相信你只是強烈地鍵入數組中的對象

因此,當將實例化對象放入數組時。 它必須是從抽象類擴展的對象

沒有粉紅色的魔法獨角獸。

但你仍然可以為粉紅魔法獨角獸建立一個穩定的,你永遠不會放任何東西,因為沒有。

更現實的比喻:你不能去寵物商店買“哺乳動物”。 這太抽象了。

但是,你可以為哺乳動物建立一個穩定的。 然后你可以買馬,牛,狗,貓,大象,長頸鹿,狼,豹子和獅子,並把它們放在那里。 也許甚至是粉紅色的魔法獨角獸,如果你能找到的話。

(如何建造一個可以同時容納老鼠和駝背鯨的馬廄,留給讀者作為練習。)

不,你不能創建一個“他們”的數組,因為你不能將抽象類型放入列表中。 抽象類型的列表包含抽象類型的任何派生實例。

只是意味着抽象類型的任何派生類型都可以在列表中

暫無
暫無

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

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