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

Wha*_*hat 12 .net c#

我们不能创建抽象类的对象,但我们可以创建List或它们的数组.有什么不同?

Gra*_*tly 15

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

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

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

  • "而你还没有创建任何实例." - 除了列表或数组; 它本身就是列表或数组的实例. (2认同)

Jam*_*unn 8

答案摘要:

List或数组本身不是一个抽象类,即使它声明它将保存的类型一个抽象类.

更详细的答案:

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

基本上,给定抽象类Abstraction,以及Concrete扩展的具体类Abstraction,List<Abstraction>意味着你可以在其中的任何东西,它是扩展的东西Abstraction的实例,例如Concrete.虽然数组在某些方面与列表有点不同,但同样也适用于它们.

例:

鉴于此类:

public abstract class Abstraction {

}
Run Code Online (Sandbox Code Playgroud)

而这堂课:

public class Concrete : Abstraction {

}
Run Code Online (Sandbox Code Playgroud)

你不能这样做:

Abstraction a = new Abstraction();
Run Code Online (Sandbox Code Playgroud)

但你可以这样做:

Abstraction a = new Concrete();
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

IList<Abstraction> list = new List();
list.add(a);
Run Code Online (Sandbox Code Playgroud)


Mar*_*eri 6

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

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

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

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

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