[英]What is the difference between object of an abstract class and list of objects of abstract class?
我們不能創建抽象類的對象,但我們可以創建List或它們的數組。 有什么不同?
列表或數組只是一組指針的占位符,您還沒有創建任何實例。
當你說創建對象 - 你的意思是創建一個實例 - 你不能用抽象類。
但是你可以創建指向它們的列表或數組(並且是EMPTY) - 然后你可以將指針移動到派生類/對象的“真實”實例
答案摘要:
List或數組本身不是一個抽象類,即使它聲明它將保存的類型是一個抽象類。
更詳細的答案:
即使你不能創建一個抽象類的對象(“of”這個詞有些模糊,但顯然你的意思是作為該類的直接實例化),你可以創建一個對象,它是一個抽象類的實例 (因為它是擴展所述抽象類的具體類的實例。
基本上,給定抽象類Abstraction
,以及擴展Abstraction
具體類Concrete
, List<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.