单根类层次结构的优点

对不起,如果这是一个愚蠢的问题,但我想了解单一根类(对象)层次结构在.Net,Java等语言中的所有优点。

我可以想到一个优点,假设我有一个函数,我想接受所有类型的(引用)数据类型。 那么在那种情况下,我可以编写我的函数,而不是为每种数据类型编写函数。

public void MyFun(object obj) { // Some code } 

我们从这种类型的层次结构中获得了所有其他优势?

我将从一本好书中引用一些文章 – 布鲁斯·埃克尔的“ 思考Java” :


单根层次结构中的所有对象都有一个共同的接口,因此它们最终都是相同的类型。 替代方案(由C ++提供)是您不知道所有内容都是相同的基本类型。 从向后兼容的角度来看,这更符合C模型,可以被认为是限制性较小的,但是当你想要进行全面的面向对象编程时,你必须构建自己的层次结构,以提供内置的相同的便利性。其他OOP语言。 在您获得的任何新类库中,将使用一些其他不兼容的接口。 它需要努力(可能还有多重inheritance)才能将新界面应用到您的设计中。 C ++的额外“灵活性”值得吗? 如果你需要它 – 如果你有大量的C投资,它是非常有价值的。 如果您从头开始,其他替代方案(如Java)通常可以提高效率。


可以保证单根层次结构中的所有对象(例如Java提供)具有某些function。 您知道可以对系统中的每个对象执行某些基本操作。 单根的层次结构,以及在堆上创建所有对象,极大地简化了参数传递。


单根的层次结构使得实现垃圾收集器(它可以方便地构建到Java中)变得更加容易。 必要的支持可以安装在基类中,因此垃圾收集器可以将适当的消息发送到系统中的每个对象。 如果没有单根的层次结构和通过引用操作对象的系统,则很难实现垃圾收集器。


由于运行时类型信息保证在所有对象中,因此您永远不会得到一个您无法确定其类型的对象。 这对于系统级操作尤其重要,例如exception处理,并允许更大的编程灵活性。


单根层次结构不是将对象传递给方法,而是将所有对象实现的公共接口传递给方法。

例如,在C#中, System.Object实现了很少的成员,这些成员在层次结构中inheritance。

例如,这包括ToString() ,用于获取对象的文字表示。 您可以保证,对于每个对象, ToString()都会成功。 在语言级别,您可以使用此function从(4-11).ToString()等表达式中获取字符串。

另一个例子是GetType() ,它返回System.Type类型的对象,表示调用该方法的对象的类型。 因为此成员是在层次结构的顶部定义的,所以reflection比在C ++中更容易,更均匀。

单根层次结构使平台开发人员能够对所有对象拥有一些最低限度的知识,从而简化了可用于所有其他对象的其他库的开发。

想想没有GetHasCode的集合,没有GetType的reflection等。

它为一切提供了基础。 例如,在C#中,Object类是具有ToString()和GetType()等方法的根,如果您不确定要处理哪些特定对象,这些方法非常有用。

另外 – 不确定它是否是一个好主意,但你可以在Object类上创建扩展方法,然后每个类的每个实例都能够使用该方法。

例如,您可以创建一个名为WriteToLogFile的扩展方法(此对象o),然后让它使用对象上的reflection将其实例成员的详细信息写入您的日志。 有一些更好的记录方法,但它只是一个例子。