1

我没有任何论据反对为什么我们只需要一个通用类。但是,为什么我们不拥有两个通用类,比如一个 Object 和一个 AntiObject 类。在自然和科学中,我们发现了二元性的概念——比如能量和暗能量;男女; 正负; 乘除法;电子和质子;整合与推导;在集合论中。二元论的例子太多了,它本身就是一种哲学。在编程本身中,我们看到与我们使用设计模式的方式形成对比的反模式,它可以帮助我们执行工作。我们称之为面向对象编程。这是一个限制因素,还是在理解编程语言的形成时我缺少一些基本的东西?

编辑:我不确定,但这种二元性概念的用处可能在于创建垃圾收集器,这些垃圾收集器创建反对象,这些反对象与自由或松散的对象结合以破坏自身,从而释放内存。或者可能是 AntiObjects 与 Objects 一起创建一种自修改编程语言——它允许我们创建安全的自修改代码,使用基因编程进行进化计算,隐藏代码以防止逆向工程。我已将此问题移至 Stack Exchange 的计算机科学站点,因为这里认为这是题外话。如果您想评论/回答这个问题,请使用它。

4

2 回答 2

4

由于多种原因,继承树通常(就像在 C# 中一样)是一棵具有单个根的树,这些原因似乎都导致了一个大树:

  • 如果有多个根,就没有办法指定“任何类型的对象”(除了 C++ 之类的东西void *,因为它抛弃了任何“类型”的概念,这将是可怕的)。
  • 即使是“任何类型的对象”的想法也失去了一些用处,因为您不能再保证您将接受的对象的任何事情。你怎么说“所有对象都具有属性a、bc ”以让程序实际使用它们?您需要一个所有接口都实现的接口……然后,该接口成为根类型
  • 如果不能收集他们管理的每种类型的对象,支持 GC 的语言将毫无用处。 糟糕,又出现了“任何类型的对象”!

总而言之,将一种类型作为层次结构的根会更简单。它使您可以制定适用于系统中每个对象的合同/保证/等,并减少对希望能够以通用方式处理对象的代码的要求。

C++ 避免了拥有多个根类型,因为 (1) C++ 允许多重继承,因此对象可以弥合继承树之间的差距;(2) 它有模板(它们泛型更能接受任何类型的对象);(3) 它可以通过类似的方式完全抛弃和回避任何“类型”的概念void *;(4) 它不提供为您管理和收集您的物品。

C# 不想要多重继承和模板的所有复杂性,它想要垃圾收集。

于 2012-08-07T06:24:49.623 回答
2

在自然界中,如果一个家庭中有两个完全不同、完全相反的孩子,他们仍然有共同的父母。

您给出的所有这些示例都属于共同类别。例如,男性和女性属于 Homosapiens 类别。加号和减号属于运算符类别。

在 OOPS 中也有两种类型。引用类型和值类型,但它们仍然属于对象。

你的建议也不错。但是让我们在宇宙中接受你的建议。仍然会有一个Super_Class包含您的 Object 和 AntiObject 类。所以它必须在某个地方停下来,在 OOPSobject中就是它停止的那个类。

于 2012-08-07T06:10:29.990 回答