【问题标题】:Whys is it a bad idea to have an Object[] array?为什么拥有一个 Object[] 数组是个坏主意?
【发布时间】:2011-11-06 18:16:26
【问题描述】:

几天前我正在向一位朋友解释概念或继承和容器。

他的编程知识很少,所以这实际上只是一次友好的聊天。 在谈话中,他带着一个我无法回答的问题来找我。

“为什么你不能只拥有一个顶级类的数组,然后向其中添加任何东西”

我知道这是一个坏主意,之前被比我聪明得多的人这么说,但我这辈子都不记得为什么了。

我的意思是我们一直在用继承来做这件事。

假设我们有一个类动物,它是猫和狗的父母。如果我们需要这两者的容器,我们创建一个动物类型的数组。

假设我们没有那个继承链接,我们不能只使用基对象类并将所有东西都放在一个容器中。


没有特定的编程语言。

【问题讨论】:

  • 对于给定的语言/问题,它不一定是“坏的”(假设像 Java 这样的语言),但可能有更好的方法——“更好”通常意味着更好的类型.正如所指出的,AnimalInterface[]Animal[] 可能会更好——但这只有在可以统一Object 之前的类型时才有效。

标签: arrays class inheritance object containers


【解决方案1】:

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

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

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

【讨论】:

  • 不一定,也不要忘记 RTTI。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        这也使得代码非常难以遵循,甚至更难以扩展,更不用说容易出错了。

        Plant myplant = new Plant();
        listOfAnimals.Add(myplant); 
        

        如果列表是对象,则可以使用,但如果是 Animal,则会出现编译时错误。

        【讨论】:

        • 我并没有真正理解您对植物示例的看法......如果您尝试将植物添加到动物集合中,则会出现错误,最好是编译时出现错误,这是合乎逻辑的.
        • 正是我的观点。你想要那个错误。如果您改用对象数组,它会在运行时进一步失败。
        猜你喜欢
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 2011-06-22
        • 2011-11-29
        • 2019-04-07
        相关资源
        最近更新 更多