我没有任何反对的论点,为什么我们只需要一个通用类。但是,为什么我们没有两个通用类,例如一个对象和一个反物体类。在自然和科学中,我们发现了二元性的概念 - 例如能量与暗能量;男性和女性;正负;乘法和分裂;电子和质子;集成与派生;并在集合理论中。二元论的例子太多,以至于它本身就是一种哲学。在对其进行编程时,我们看到了反庞大的,这有助于我们与使用设计模式相比进行工作。我不确定,但是这种二元性概念的有用性可能在于创建垃圾收集器,从而创建反物体与自由或松动对象结合以破坏自己,从而释放内存。或者可能是反物体与对象一起工作以创建自修改的编程语言 - 使我们能够创建一个安全的自我修改代码,使用遗传编程进行进化计算,请隐藏代码以防止反向工程。

我们称其为面向对象的编程。这是一个限制因素,还是我在理解编程语言的形成时缺少一些基本的东西?

有帮助吗?

解决方案

这只是回答标题中问题的答案。

诸如Java之类的语言具有从对象派生的每个类,原因有两个。

首先,增加可用的多态性量。在将仿制药添加到语言中之前,这是特别需要的。没有对象,收集课将不可能以有用的方式写。

其次,有许多方法可以预期或有用,并且这些方法被收集到对象中。通过确保所有类都从对象继承,所有类都将实现相同的最小接口。

如评论中所述,C ++没有类似对象的类。 C ++在许多方面都没有类型,因此我上面提到的问题不适用。此外,C ++模板提供了很多多态性,并用于实施集合。

其他提示

我认为所接受的答案几乎涵盖了最初的问题,但是我想通过(如果可能的话)稍微提出有关次要问题的一些想法来对其进行补充(如果可以的话)。

从继承的角度来看,没有什么可以阻止类层次结构具有多个根。正如其他民族指出的那样,C ++以及许多OO语言并不将表达性限制为单个根祖先类。

但是,从 键入理论 观点(回想一下继承和亚型不是同一回事,所以我可能会从这里走出主要问题的框架),一个单一的“ top”超构型可以很有意义(取决于类型理论课程)。例如,在OCAML中,所有对象(无论是类实例还是直接对象)都有一个常见的超构型, < > 要表示对象类型是空的,即不接受任何消息。这似乎确实是我们可以定义的最通用的对象类型,因为我们无法从中删除任何内容以使其更一般。因此,在这种对象类型的概念中,所有对象都必须有一个超级构想。

关于根对偶的双重,斯卡拉(Scala)举办了一个名为 Nothing, ,奇怪的是,这也是空的,并且是其他所有类的子类型。它不能实例化,但具有足够有用的语义来实现空列表,这就是称为 Nil, ,等于 List[Nothing] (正如评论中指出的那样,在大多数情况下,程序员可能永远不会直接使用该值,从而使其似乎不像它那样有用)。 Nothing 可以认为是根类型的双重 - 称为 Any 在Scala中,这些类型不仅涵盖了类,还包括原语类型,因此所有内容都可以升至 Any, , 例如。

定义可以持有任意事物的收藏的能力,而无需为不同类型的事物定义不同的方法。 C ++中的模板使单个源文件可以定义可以容纳许多不同类型的内容的集合类型,但是编译器将必须为集合中的每种不同类型的内容复制代码。相反,如果人们定义了系统中几乎所有类型的类型,那么可以将其引用到该类型的内容的集合将能够保留几乎任何类型的事物的引用。

但是,这种方法确实有一个限制,即它模糊了价值观和实体之间的区别。通过识别某些特定对象来封装值的参考可以用对该对象的副本的引用而无需更改其语义。但是,用于识别实体的参考不能以这种方式替换。实体本身将是无法复制的东西(例如,如果它代表与现实世界中的事物的联系),或者实体可能会封装 存在的一组参考. 。要注意的一个关键是,当对象无法更改或仅存在一个引用时,对象将其行为,而当存在多个引用时,它们的行为就像实体一样。

模糊价值和实体之间的区别使收集类型难以知道它们是否应该将其内容视为价值或实体;反过来,这限制了收藏的能力 equals 或者 clone 以有用的方式。使更强类型/实体区别的语言可以使收藏的收藏更大,而不是没有语言,但区分增加了一些复杂性,而语言设计师可能会或可能不会感到这些好处是合理的。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top