Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 为什么超级类和子类是相反的?_Language Agnostic_Oop_Programming Languages - Fatal编程技术网

Language agnostic 为什么超级类和子类是相反的?

Language agnostic 为什么超级类和子类是相反的?,language-agnostic,oop,programming-languages,Language Agnostic,Oop,Programming Languages,在集合论中,如果集合包含原始集合中的所有内容,并且可能包含更多内容,那么集合就是超集。然而,子集并不包含初始集的所有内容 考虑到这一点,在大多数面向对象编程语言中(我考虑的是Objective-C,但我知道Java和其他语言也是如此),父类称为super类,从super继承的任何类都称为子类 这不是倒退吗?子类从其超类继承所有实例变量和方法,因此它“包含”父类的所有内容,以及子类中添加的任何内容。这只是一个命名错误还是故意的,如果是这样的话,原因是什么?超类定义了一个类,该类的成员可能具有更大的

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

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


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

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


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

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

可能与堆栈向下生长(顶部底部)树向下生长(顶部根部)的原因相同二维图形系统几乎总是象限四(左上角的0,0)。

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

  • 这些性质和方法与集合论中的子/超关系无关:

    • 子类定义的属性和方法可以扩展到其超类提供的属性和方法之外(事实上,它们通常是这样),但子类的实例仍然是超类实例集的成员
    • 换句话说,sub/super关系不是由属性和方法定义的,而是由类命名所需的实例级语义定义的
  • Taxomony示例:

    • 所有人的集合比所有程序员的集合更大
    • 事实上,集合人员是集合程序员的超集
    • 集合程序员是集合人员的子集
  • 所以在OOP术语中,人是一个超类,程序员是一个子类。每个程序员都是一个人,但不是每个人都是程序员。因此,超类和子类。程序员类可能拥有超越凡人知识的超能力这一事实并没有改变类关系(is-a)语义

    子类拥有其超类的所有[成员]以及更多。这不是倒退吗

    这个问题在编程语言中随处可见,总是让我头疼。(特别是子类型。)

    规则如下:

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

    • 当您考虑上下文、接口或参数时,角色是反向的。例如,与期望子类型参数的方法相比,期望超类型/父/超类参数的方法可以接受更多的参数

    哪一个位于顶部完全取决于您认为对象是主要的还是您认为上下文预期对象是主要的。我研究这门学科已经将近15年了,但我的直觉仍然背叛了我

    如果将类声明视为规范,则更多的对象满足超类规范,更少的对象满足子类规范。我相信这就是命名的原因。(如果您谈论子类型和超类型,会更清楚一些—子类型中的值比其超类型中的值少,因为子类型的每个值也是该超类型的值,并且该超类型中可能包含非该子类型成员的其他值。)


    我提到过整个话题让我头疼吗?

    格雷格的回答是正确的。下面是一个示例说明:

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

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

    换句话说,DerivedA对象集中的每个对象也都在基础对象集中。DerivedB也是如此。因此,Base实际上是DerivedA和DerivedB的超集。因此,它是“超类”。

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

    从另一个角度来看,超类类似于数字中的前导数字(为了便于编程语言进行类比,我们称之为浮点数)。当数字获得更多的数字时,每个新数字“继承”前面的所有数字。类似地,随着子类获得更多的方法,它将按照命名的顺序继承它前面的超类列表


    希望这能有所帮助。

    在说一个或另一个toojbrennan之前,我总是要检查一下自己:你不应该把一个类看作是它的一组属性。您应该将其视为所有可能实例的集合。那就有意义了。正如在数学中,Z是N的严格超集,因为所有的自然数都是整数,但并非所有的整数都是自然数,Object是java中字符串的超类,因为所有字符串都是对象,但并非所有对象都是字符串。@jbrennan:您考虑的是类的属性,而不是该类型的可能值(在集合术语中,由类定义的值集合的成员)。所有可能的<代码