我们不能创建抽象类的对象,但我们可以创建List或它们的数组.有什么不同?
列表或数组只是一组指针的占位符,您还没有创建任何实例.
当你说创建对象 - 你的意思是创建一个实例 - 你不能用抽象类.
但是你可以创建指向它们的列表或数组(并且是EMPTY) - 然后你可以将指针移动到派生类/对象的"真实"实例
答案摘要:
List或数组本身不是一个抽象类,即使它声明它将保存的类型是一个抽象类.
更详细的答案:
即使你不能创建一个抽象类的对象("of"这个词有些模糊,但显然你的意思是作为该类的直接实例化),你可以创建一个对象,它是一个抽象类的实例(因为它是扩展所述抽象类的具体类的实例.
基本上,给定抽象类Abstraction
,以及Concrete
扩展的具体类Abstraction
,List
意味着你可以在其中的任何东西,它是扩展的东西Abstraction
的实例,例如Concrete
.虽然数组在某些方面与列表有点不同,但同样也适用于它们.
例:
鉴于此类:
public abstract class Abstraction { }
而这堂课:
public class Concrete : Abstraction { }
你不能这样做:
Abstraction a = new Abstraction();
但你可以这样做:
Abstraction a = new Concrete();
然后你可以这样做:
IListlist = new List(); list.add(a);
可以声明并初始化一个列表,其中成员的类型是抽象类,因为要创建此对象,您不需要实际实例化抽象类.
从逻辑上讲,列表只是指针的容器.
例如,您可以定义抽象类的列表,但此列表可以在开头为空.
您也可以使用初始大小初始化列表,但在开始时它不包含对实际对象的引用:初始化将仅为指针预分配空间.
添加到列表中的对象必须是扩展抽象类的具体类的实例.