为什么超级和子级逆转?

时间:2010-02-21 00:38:37

标签: language-agnostic oop programming-languages

在集合论中,如果集合包含原始集合中的所有内容并且可能更多,则集合是超集。但是,子集不包含初始集的所有内容。

考虑到这一点,在大多数面向对象的编程语言中(我在考虑Objective-C,但我知道Java和其他语言也是如此),父类称为super类,并且任何继承自super的类都称为subclass

这不是倒退吗?子类从其超类继承所有实例变量和方法之类的东西,因此它“包含”来自父类的所有内容,以及子类中添加的任何内容。这只是一个命名错误,还是这个故意,如果是这样,为什么?

7 个答案:

答案 0 :(得分:21)

超类定义了一个具有更大可能值集合的类作为成员。子类限制可以作为其类的一部分的项,因此它定义了一组较小的可能的成员。

超类的可能成员集是该超类的子类的可能成员集的超集。

答案 1 :(得分:7)

格雷格是对的。需要考虑的两件事可能会更清楚:

  1. 在集合论方面,属性和方法与子/超关系无关:

    • 子类定义的属性和方法可能超出其超类提供的属性和方法(实际上,它们经常这样做),但子类的实例仍然是实例集的成员超类
    • 换句话说,sub / super关系不是由属性和方法定义的,而是由类命名所预期的实例级语义定义
  2. Taxomony示例:

    • 所有人的集合大于所有程序员的集合
    • 集合People实际上是集合程序员的超集
    • 集合程序员是集合人员的子集
  3. 所以在OOP术语中,People将是一个超类,而Programmer将是一个子类。每个程序员都是一个人,但不是每个人都是程序员。因此超类和子类。程序员类可能具有超越凡人的超能力这一事实不会改变类关系(is-a)语义。

答案 2 :(得分:3)

格雷格的回答是正确的。以下是一个例子的解释:

你有一个基类Base。您有两个派生类DerivedA和DerivedB。 DerivedA的每个实例也是Base的实例。同样,每个DerivedB也是一个Base。但是,DerivedA 是DerivedB,反之亦然。所以,如果你要绘制所有可能物体的宇宙的维恩图,你会得到:

    ________________________
   /                        \
  /          Base            \
 /    ______        ______    \
|    /      \      /      \    |
|   /        \    /        \   |
|  | DerivedA |  | DerivedB |  |
|   \        /    \        /   |
|    \______/      \______/    |
 \                            /
  \                          /
   \________________________/

换句话说,DerivedA对象集中的每个对象在Base对象集中也是 。同样适用于DerivedB。所以Base确实是DerivedA和DerivedB的超集。因此,它是“超类”。

答案 3 :(得分:2)

可能出于同样的原因,堆栈会向下生长(在顶部的底部),树木会向下生长(根部在顶部),2D图形系统几乎总是象限IV(左上角为0,0)。

答案 4 :(得分:1)

我回避整个超级/子类问题,并将它们称为“派生”和“父级”类。

答案 5 :(得分:1)

  

子类包含其超类[和更多]的所有[成员]。这不是倒退吗?

这个问题突然出现在各种编程语言中,它总是让我头疼。 (特别是分类。)

以下是规则:

  • 当您考虑使用obejcts时,子类/子/子类型具有更多方法和成员。它可以在更多上下文中使用。这似乎违反直觉。

  • 当您考虑上下文,接口或参数时,角色会被颠倒。例如,期望超类型/父类/超类的参数的方法可以接受比期望子类型参数的方法更多的参数

哪一个最重要取决于您是否认为对象是主要的,或者您是否认为期望对象的上下文是主要的。我已经研究了这个主题近15年了,我的直觉仍然背叛了我。

如果类声明被视为规范,则 more 对象会满足超类规范,并且子类规范得到满足通过更少的对象。我相信这就是命名法的原因。 (如果你谈论子类型和超类型,则更清楚一点 - 子类型的值比其超类型更少,因为子类型的每个值也是超类型的值,并且超类型可能由其他值居住。不是子类的成员。)

我是否提到整个话题让我头疼?

答案 6 :(得分:1)

是的,但如果您将图表视为地形图,则子类的高度高于超类。因此混乱。

另一种看待这种情况的方法是,超类类似于数字中的前导数字(为了使这种编程语言成为友好的类比,我们将说一个浮点数)。当数字获得更多数字时,每个新数字“继承”其前面的所有数字。类似地,当子类获得更多方法时,它会在它们之前的命名顺序中继承超类列表。

希望这有帮助。