他的编程知识很少,所以它只是一个友好的聊天。 在谈话中,他找到了一个我无法回答的问题。
“为什么你不能只拥有顶级类的数组,并添加任何东西”
我知道这是一个坏主意,之前被一个更聪明的人告诉过,但对于我的生活,我不记得为什么。
我的意思是我们一直都是继承。
说我们有猫狗的父母的类动物。如果我们需要这两个容器,我们制作动物类型的数组。
因此,假设我们没有继承链接,我们不能只使用基础对象类并将所有内容放在一个容器中。
没有特定的编程语言。
答案 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,则会出现编译时错误。