在集合论中,如果集合包含原始集合中的所有内容并且可能更多,则集合是超集。但是,子集不包含初始集的所有内容。
考虑到这一点,在大多数面向对象的编程语言中(我在考虑Objective-C,但我知道Java和其他语言也是如此),父类称为super
类,并且任何继承自super的类都称为subclass
。
这不是倒退吗?子类从其超类继承所有实例变量和方法之类的东西,因此它“包含”来自父类的所有内容,以及子类中添加的任何内容。这只是一个命名错误,还是这个故意,如果是这样,为什么?
答案 0 :(得分:21)
超类定义了一个具有更大可能值集合的类作为成员。子类限制可以作为其类的一部分的项,因此它定义了一组较小的可能的成员。
超类的可能成员集是该超类的子类的可能成员集的超集。
答案 1 :(得分:7)
格雷格是对的。需要考虑的两件事可能会更清楚:
在集合论方面,属性和方法与子/超关系无关:
Taxomony示例:
所以在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)
是的,但如果您将图表视为地形图,则子类的高度高于超类。因此混乱。
另一种看待这种情况的方法是,超类类似于数字中的前导数字(为了使这种编程语言成为友好的类比,我们将说一个浮点数)。当数字获得更多数字时,每个新数字“继承”其前面的所有数字。类似地,当子类获得更多方法时,它会在它们之前的命名顺序中继承超类列表。
希望这有帮助。