为什么超级和子级逆转?

jbr*_*nan 20 language-agnostic oop programming-languages

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

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

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

Gre*_*ill 21

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

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

  • jbrennan:你不应该把一个类视为一组属性.您应该将其视为一组所有可能的实例.那就有意义了.就像在数学中一样,Z是N的严格超集,因为所有自然数都是整数,但并非所有整数都是自然数,Object是java中的超类,因为所有字符串都是对象,但并非所有对象都是字符串. (11认同)
  • 虽然这是一个很好的解释,但我感觉这是从空中摘下来的,用于回顾性地解释为什么结果是这样的:P。有机会提供一些参考吗? (2认同)
  • @Matt - 我也有这种感觉!有趣的是,他们会添加“SubClass extends SuperClass”。 (2认同)
  • @Matt:这是直接理论 - 但它完全是关于_instances_,而不是属性和方法. (2认同)

Ste*_*owe 7

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

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

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

    • 所有人的集合都大于所有程序员的集合
    • 实际上,集合People是集合程序员的超集
    • 集合程序员是集合People的子集

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