抽象类的对象和抽象类的对象列表之间有什么区别?

时间:2015-12-25 19:26:40

标签: c# .net

我们无法创建抽象类的对象,但我们可以创建List或它们的数组。有什么区别?

8 个答案:

答案 0 :(得分:15)

列表或数组只是一组指针的占位符,你还没有创建任何实例。

当你说创建对象时 - 你的意思是创建一个实例 - 你不能用抽象类做。

但是你可以创建指向它们的列表或数组(并且是EMPTY) - 然后你可以将指针移动到派生类/对象的“真实”实例

答案 1 :(得分:8)

答案摘要:

List或数组本身不是抽象类,即使它声明它将保持的类型是抽象类。

更详细的答案:

即使你不能制作一个抽象类的对象(""这个词有些模糊,但显然你的意思是作为该类的直接实例),你可以创建一个 实例的抽象类对象(因为它是扩展所述抽象类的具体类的实例)。

基本上,给定抽象类Abstraction和扩展Concrete的具体类AbstractionList<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);

答案 2 :(得分:6)

可以声明并初始化成员类型为抽象类的列表,因为要创建此对象,您不需要实际实例化抽象类。

逻辑上,列表只是指针的容器。

例如,您可以定义抽象类的列表,但此列表可以在开头为空。

您也可以使用初始大小初始化列表,但在开始时它不会包含对实际对象的引用:初始化将仅为指针预分配空间。

添加到列表中的对象必须是扩展抽象类的具体类的实例。

答案 3 :(得分:3)

您无法为obvious reasons创建抽象类的实例,但无论 T 是抽象类,都必须创建List<T>类的实例。

让抽象类被称为ClassAbstract

  • 当您尝试做 - new ClassAbstract()时,您尝试创建ClassAbstract的对象。
  • 当您执行 - new List<ClassAbstract>()时,您会创建List<T>类的对象。

答案 4 :(得分:2)

List为空!

这意味着没有abstract类的实例。

允许创建一个空列表。您可以(稍后)向其添加一个扩展它的non abstract类。

答案 5 :(得分:2)

我相信你只是强烈地键入数组中的对象

因此,当将实例化对象放入数组时。它必须是从抽象类

扩展的对象

答案 6 :(得分:2)

没有粉红色的魔法独角兽。

但你仍然可以为粉红魔法独角兽建立一个稳定的,你只是能够把任何东西放在那里,因为它没有。

更现实的比喻:你不能去宠物商店购买哺乳动物&#34;。这太抽象了。

但是,你可以为哺乳动物建立一个稳定的。然后你可以买马,牛,狗,猫,大象,长颈鹿,狼,豹子和狮子,并把它们放在那里。也许甚至是粉红色的魔法独角兽,如果你能找到的话。

(如何建造一个可以同时容纳老鼠和驼背鲸的马厩,留给读者练习。)

答案 7 :(得分:0)

不,你不能创建“他们”的数组,因为你不能把抽象类型放到列表中。抽象类型的列表包含抽象类型的任何派生实例。

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