我们无法创建抽象类的对象,但我们可以创建List或它们的数组。有什么区别?
答案 0 :(得分:15)
列表或数组只是一组指针的占位符,你还没有创建任何实例。
当你说创建对象时 - 你的意思是创建一个实例 - 你不能用抽象类做。
但是你可以创建指向它们的列表或数组(并且是EMPTY) - 然后你可以将指针移动到派生类/对象的“真实”实例
答案 1 :(得分:8)
答案摘要:
List或数组本身不是抽象类,即使它声明它将保持的类型是抽象类。
更详细的答案:
即使你不能制作一个抽象类的对象(""这个词有些模糊,但显然你的意思是作为该类的直接实例),你可以创建一个 实例的抽象类对象(因为它是扩展所述抽象类的具体类的实例)。
基本上,给定抽象类Abstraction
和扩展Concrete
的具体类Abstraction
,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);
答案 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)
不,你不能创建“他们”的数组,因为你不能把抽象类型放到列表中。抽象类型的列表包含抽象类型的任何派生实例。
只是意味着抽象类型的任何派生类型都可以在列表中