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

12

我们无法创建抽象类的对象,但我们可以创建一个列表或数组。它们之间有什么区别?


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Grantly
2
@Grantly,为什么不把它变成一个答案呢 ;) - quadroid
抱歉当时有点困惑 :) 谢谢,我会的,但其他人应该已经解决了 - 我相信它会被踩到底的哈哈...现在就开始吧 ;) - Grantly
3
水果和盒子有什么不同?盒子只是用来放水果的容器,它们是完全不同的。水果无法生长,但苹果、桃子等可以。而如果需要储存水果,你可以随时购买另一个盒子。 - Dennis
1
你也可以创建一个接口列表,但是你不能直接创建一个接口的实例... ;) - MBender
8个回答

14

列表或数组仅是一组指针的占位符,并且您尚未创建任何实例。

当您说“创建对象”时,您指的是创建一个实例-这是您无法使用抽象类实现的。

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


2
除了列表或数组本身作为列表或数组的实例外,你还没有创建任何实例。 - James Dunn
@TJamesBoone,你说得完全正确,但我不想让问题变得更加混乱或复杂。我的回答并不是非常全面,缺少其他人提供的细节,但我希望能够给出一个简短的回答来匹配这个问题。 - Grantly

7

答案摘要:

列表或数组本身不是抽象类,即使它声明的类型是一个抽象类。

详细解答:

虽然你不能创建一个抽象类的对象(“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);

1
你可能是想要写成public class Concrete: Abstraction,注意这里是冒号,而extends是Java中的用法。 - Kroltan
1
哎呀,你说得对。我已经有一段时间没有用C#了,最近几年一直在做Java。 - James Dunn

6

可以声明和初始化一个列表,其中成员的类型是抽象类,因为创建此对象不需要实际实例化抽象类。

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

例如,您可以定义一个抽象类的列表,但此列表可能一开始为空。

您还可以使用初始大小初始化列表,但一开始它不会包含对实际对象的引用:初始化只会预先分配指针的空间。

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


3

你不能创建一个抽象类的实例,这是显而易见的原因(参见),但是创建一个List<T>类的实例是允许的,无论T是否为抽象类。

假设抽象类的名称为ClassAbstract

  • 当你尝试执行new ClassAbstract()时,你试图创建一个ClassAbstract对象。
  • 当你执行new List<ClassAbstract>()时,你创建了一个List<T>类的对象。

2

List 是空的!

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

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


2

我相信你只是在强制指定数组内的对象类型

因此,在将实例化的对象放入数组时,它必须是从抽象类扩展的对象


2

没有粉色魔法独角兽。

但是你仍然可以建造一个粉色魔法独角兽的马厩,只是你永远无法把它们放进去,因为它们不存在。

更现实的类比:你不能去宠物店买“一只哺乳动物”。那是太抽象的东西了。

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

(如何建造一个既可容纳老鼠又可容纳座头鲸的马厩留给读者自己思考。)


当我读到你回答的第一行时,我以为我点错了其他问题并正在阅读那个问题的答案。然后我检查了一下是否在正确的问题上。然后我明白了你的观点。:D - displayName

0

不可以创建一个“它们”的数组,因为你不能将抽象类型放入列表中。抽象类型的列表可以容纳任何派生自该抽象类型的实例。

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


2
我认为用户的意思是声明一个列表,其中成员是抽象类。这是完全可能的。 - Marco Altieri
1
当然可以,但他提到了“它们”,而你不能将对象的抽象实例放入其中。 - Keith Nicholas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接