我们无法创建抽象类的对象,但我们可以创建一个列表或数组。它们之间有什么区别?
我们无法创建抽象类的对象,但我们可以创建一个列表或数组。它们之间有什么区别?
列表或数组仅是一组指针的占位符,并且您尚未创建任何实例。
当您说“创建对象”时,您指的是创建一个实例-这是您无法使用抽象类实现的。
但是,您可以创建指向它们(并且为空)的列表或数组,然后将指针移动到派生类/对象的“真实”实例。
答案摘要:
列表或数组本身不是抽象类,即使它声明的类型是一个抽象类。
详细解答:
虽然你不能创建一个抽象类的对象(“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);
public class Concrete: Abstraction
,注意这里是冒号,而extends
是Java中的用法。 - Kroltan可以声明和初始化一个列表,其中成员的类型是抽象类,因为创建此对象不需要实际实例化抽象类。
从逻辑上讲,列表只是指针的容器。
例如,您可以定义一个抽象类的列表,但此列表可能一开始为空。
您还可以使用初始大小初始化列表,但一开始它不会包含对实际对象的引用:初始化只会预先分配指针的空间。
添加到列表中的对象必须是扩展抽象类的具体类的实例。
你不能创建一个抽象类的实例,这是显而易见的原因(参见),但是创建一个List<T>
类的实例是允许的,无论T是否为抽象类。
假设抽象类的名称为ClassAbstract
。
new ClassAbstract()
时,你试图创建一个ClassAbstract
对象。new List<ClassAbstract>()
时,你创建了一个List<T>
类的对象。List
是空的!
这意味着没有 abstract
类的实例。
允许创建一个空列表。您可以(稍后)添加一个扩展它的 non abstract
类。
我相信你只是在强制指定数组内的对象类型
因此,在将实例化的对象放入数组时,它必须是从抽象类扩展的对象
没有粉色魔法独角兽。
但是你仍然可以建造一个粉色魔法独角兽的马厩,只是你永远无法把它们放进去,因为它们不存在。
更现实的类比:你不能去宠物店买“一只哺乳动物”。那是太抽象的东西了。
但是,你可以建造一个哺乳动物的马厩。然后你可以买马、牛、狗、猫、大象、长颈鹿、狼、豹子和狮子,并把它们放在里面。如果你能找到的话,甚至可以放粉色魔法独角兽。
(如何建造一个既可容纳老鼠又可容纳座头鲸的马厩留给读者自己思考。)
不可以创建一个“它们”的数组,因为你不能将抽象类型放入列表中。抽象类型的列表可以容纳任何派生自该抽象类型的实例。
这意味着抽象类型的任何派生类型都可以在列表中。