有一个Object []数组是不是一个坏主意?

时间:2011-11-06 18:16:27

标签: arrays class inheritance object containers

几天前我向朋友解释了概念或继承和容器。

他的编程知识很少,所以它只是一个友好的聊天。 在谈话中,他找到了一个我无法回答的问题。

“为什么你不能只拥有顶级类的数组,并添加任何东西”

我知道这是一个坏主意,之前被一个更聪明的人告诉过,但对于我的生活,我不记得为什么。

我的意思是我们一直都是继承。

说我们有猫狗的父母的类动物。如果我们需要这两个容器,我们制作动物类型的数组。

因此,假设我们没有继承链接,我们不能只使用基础对象类并将所有内容放在一个容器中。


没有特定的编程语言。

5 个答案:

答案 0 :(得分:2)

从语法上讲,这没有问题。通过声明特定类型的数组,您将提供有关该数组内容的隐式信息。您可以声明包含Object个实例,但这意味着您在编译时丢失了原始类的所有类型信息。

这也意味着每次在运行时从数组中获取对象时,您知道的唯一字段实例和方法是Object的字段/方法(可以说是编译时问题)。要使用对象的更具体子类的任何字段和方法,您必须强制转换。

或者,要在运行时找到特定的类,您必须使用反射等功能,这些功能在大多数情况下都是过度的。

答案 1 :(得分:0)

当你从容器中取出元素时,你想要对它们可以做些什么有一些保证。如果容器的所有元素都作为Animal的实例返回(请记住Dog的实例也是Animal的实例),那么您就知道他们可以做Animals的所有事情1}}可以做(这比Objects所能做的更多。)

答案 2 :(得分:0)

也许,我们在编程中这样做与生物学中的原因相同?爬行动物和鲸鱼是动物,但它们完全不同。

答案 3 :(得分:0)

这取决于具体情况,但是如果没有上下文,大多数(如果不是全部)面向对象语言都可以拥有一个基类型数组(也就是说,只要它们遵循所有的替换原则)不同派生类型的各种实例。

答案 4 :(得分:0)

在大多数语言中,某些情况下都存在对象数组。问题是,无论何时你想使用它们,你都需要记住它们的类型,并保持它们或其他任何类型。

这也使得代码非常可怕,甚至更加可怕的延伸,更不用说容易出错了。

Plant myplant = new Plant();
listOfAnimals.Add(myplant); 
如果列表是对象,

将起作用,但如果它是Animal,则会出现编译时错误。