关于类定义的困惑

时间:2020-06-26 18:19:57

标签: java android kotlin

我对接下来的条款有些困惑。我想我没错,但是程序员一直都说错了,所以我想确定一下。

如果我们有A类,而B类是A类的内部类。我听到很多程序员说“ A类是B类的父类”。 对我来说,这是错误的。 A类是B类的外部类。 仅当类B继承类A时,类A才是父类。

这很令人困惑,因为(因为我是Android开发人员)人们还在定义布局时使用这些术语,因此他们说:

Imageview,TextView和Edittext是ConstraintLayout的子级,而ConstraintLayout是其父级。 即使我同意这句话,也与前面关于类的示例相矛盾。如果我们遵循前面的示例,我们应该说: ConstraintLayout是外部元素,而这3个是其内部元素。

请有人可以与我分享意见或确认我的疑问。谢谢

android中的布局示例:

<androidx.constraintlayout.widget.ConstraintLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".presentation.main.MainActivity">

     <ProgressBar
        android:id="@+id/progressBar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

  <TextView
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    tools:ignore="RtlSymmetry" />

</androidx.constraintlayout.widget.ConstraintLayout>

3 个答案:

答案 0 :(得分:2)

当我们有这样的类定义时:

class A extends B {
    static class X {}
    class Y {}
}

然后,按照标准术语[12],您可以这样说:

  • AB
  • 子类
  • BA超类
  • XYA
  • 嵌套类
  • A是封闭的类{strong},分别是XY
  • XA静态嵌套类
  • YA内部类

根据Java Documentation,术语“父类”与“超类”同义。不过实际上,它用于表示许多不同的事物(例如“封闭类”或“ parent字段的类”)。自然语言是一团糟。人们有时会使用不同的名称来称呼同一事物,即使使用适当的标准通用术语也是如此。因此,您唯一可以做的就是要知道,“父类”(取决于上下文)有时可能表示“超类”,有时是“封闭类”,有时还有其他含义。如果您想保持明确,请始终使用术语“超类”而不是“父类”。

答案 1 :(得分:2)

一些事情需要清除:

的上下文中:假设您有类A扩展了类B。类A是类B超类,而B是类A子类。将超类称为“父类”的用法很少,但仍然准确。

外部类B的内部类A不是子类,因为两者之间没有层次关系。

实例 的上下文中,情况有所不同。如果您有List<List<?>>List本身的父类?不。

但是假设您有一个

class Node {
    List<Node> children;

    void addChild(Node node) {
        children.add(node);
    }
}
Node a = new Node();
Node b = new Node();
a.addChild(b);

现在可以调用a的{​​{1}} 父节点了。但是此示例不是在类上下文中,而是实例上下文。

这是两个不同的上下文,一个不应该弄乱它们。

答案 2 :(得分:1)

Imageview,TextView和Edittext是ConstraintLayout的子级,而ConstraintLayout是其父级。即使我同意这句话,也与前面关于类的示例相矛盾。如果我们遵循前面的示例,应该说:ConstraintLayout是外部元素,而这3个是其内部元素。

您认为父母/孩子在谈论类时是专有的术语。那是不对的。许多编程语言甚至都没有类。

您使用UI元素描述的内容更类似于树数据结构。在树中,有父节点和子节点。因此ProgressBar是树中ConstraintLayout的子代。我不知道其背后的历史,但是我敢打赌,甚至在类存在之前就已经想到了树数据结构。

在Java类的上下文中,还存在父(超类)或子(子类)关系。在这种情况下:class B extends A,B是子类,而A是父类。

内部类是完全不同的东西。内部类不是其封闭类的子类,并且与该讨论似乎无关。任何将内部类称为孩子的人都使用了错误的术语。我个人从未听说过它们被称为封闭类的子类。