对不起,如果这是一个愚蠢的问题,但我想了解单一根类(对象)层次结构在.Net,Java等语言中的所有优点。
我可以想到一个优点,假设我有一个函数,我想接受所有类型的(引用)数据类型。那么在那种情况下,我可以编写我的函数,而不是为每种数据类型编写函数。
public void MyFun(object obj)
{
// Some code
}
我们从这种类型的层次结构中获得了所有其他优势吗?
答案 0 :(得分:6)
我会从一本好书中引用一些文字 - Thinking in Java Bruce Eckel:
单根层次结构中的所有对象都有一个共同的接口, 所以他们最终都是同一类型。替代方案(由提供 C ++)是你不知道一切都是一样的基础 类型。从向后兼容的角度来看,这符合模型 C更好,可以被认为是限制较少的,但是当你想要的时候 要进行全面的面向对象编程,你必须自己构建 层次结构提供与其他OOP相同的便利 语言。在你获得的任何新类库中,还有其他一些 将使用不兼容的接口。这需要努力(并且可能 多重继承)将新界面用于您的设计。是 C ++的额外“灵活性”值得吗?如果你需要它 - 如果你有 对C-C的大量投资非常有价值。如果你是从 从头开始,Java等其他替代方案通常可以提高效率。
单根层次结构中的所有对象(例如Java提供)都可以 保证具有某些功能。你知道你可以表演 对系统中的每个对象进行某些基本操作。一个人 rooted层次结构,以及在堆上创建所有对象 简化了参数传递。
单根的层次结构使得实现垃圾变得更加容易 collector(可以方便地构建到Java中)。必要 支持可以安装在基类和垃圾收集器中 因此可以将适当的消息发送到系统中的每个对象。 没有单根的层次结构和操纵对象的系统 通过引用,很难实现垃圾收集器。
由于保证运行时类型信息在所有对象中, 你永远不会得到一个你无法确定的类型的对象。 这对于系统级操作尤其重要,例如 异常处理,并允许更大的编程灵活性。
答案 1 :(得分:2)
单根层次结构不是关于将对象传递给方法,而是关于所有对象实现的公共接口。
例如,在C#中,System.Object
实现了在层次结构中继承的少数成员。
例如,这包括ToString()
,用于获取对象的文字表示。您可以保证,对于每个对象,ToString()
都会成功。在语言级别,您可以使用此功能从(4-11).ToString()
等表达式中获取字符串。
另一个示例是GetType()
,它返回类型为System.Type
的对象,表示调用该方法的对象的类型。因为此成员是在层次结构的顶部定义的,所以反射比在C ++中更容易,更均匀。
答案 2 :(得分:0)
单根层次结构使平台开发人员能够对所有对象拥有一些最低限度的知识,从而简化了可用于所有其他对象的其他库的开发。
考虑没有GetHasCode的集合,没有GetType的反射等。
答案 3 :(得分:0)
它为一切提供了基础。例如,在C#中,Object类是具有ToString()和GetType()等方法的根,如果您不确定要处理的具体对象,则非常有用。
另外 - 不确定它是否是一个好主意,但你可以在Object类上创建扩展方法,然后每个类的每个实例都能够使用该方法。
例如,您可以创建一个名为WriteToLogFile(此Object o)的扩展方法,然后让它使用对象上的反射将其实例成员的详细信息写入您的日志。有一些更好的记录方法,但它只是一个例子。