我很好奇“继承”的概念是如何在面向对象编程的世界中发生的。让我解释一下我的困境(我在学习 Java 时遇到了这个困境,但我希望我的问题本质上是通用的):
假设有一个 A 类和一个 B 类。A 类“继承”B 类。这实际上意味着什么?编译器是否创建一个“new”类,然后将其实例化为一个对象,该对象在幕后包含类 A 和 B 的元素?如果是这样的话,那么如何根据访问说明符实现访问限制呢?
有一瞬间,我想知道它是否以以下方式发生:
创建 A 类的对象,然后创建 B 类的对象。然后,Java 以某种方式将 A 的成员“链接”到 B 的成员,并使它们看起来好像属于同一个类,并且它根据访问说明符执行此操作。
但是后来我发现这个理论有问题。假设两个不同的类 B 和 C 继承了类 A。那么,如果我们要创建类 B 和类 C 的对象,那么它们将拥有自己的类 A 元素的副本。所以这个理论也失败了。
我只是想解释一下我心中对继承的困惑。这让我很头疼。请帮忙。
编辑:这是我在该网站上找到的与我的问题相关的讨论的链接。
最佳答案
我可能会失败,但我会尝试为你解释一下。
老实说,我认为您在如何构思对象编程方面可能犯了一个非常经典的错误 - 这就是区分对象和类。几乎任何面向对象语言中的对象创建都是基于类定义的构造之一。从您的问题来看,听起来好像您正在对一般的 OO 语言和对象继承(特别是聚合离散对象)进行心理建模,而实际上对象是根据聚合类来定义的 定义。
public class A
{
public A();
}
public class B:A
{
public B();
}
public class C:B
{
public C();
}
在您的 A->B->C 模型中,C 的定义是根据其自身的独特属性加上其直接祖先 B 的所有成员,其中反过来,是根据其自身的独特属性加上其直接祖先 A 的所有成员来定义的。创建对象的过程仍然是一个独特且离散的事件,并且该对象尽管它的多层遗产,在实例化时仍然只是一个对象。
关于某些成员的可见性:当类作者设计和构建类时,他会从两个不同的角度对其提供的内容做出某些决定:向类的消费者公开的内容,以及公开或公开的内容。可供子类使用。声明为私有(private)的成员和字段都是后代类的一部分,即使“契约(Contract)上”禁止子类访问它们。您可以做一个粗略的类比,电视具有开/关按钮、音量控制和颜色控制的“公共(public)”接口(interface),但具有不适合消费者的“内部”控制,例如内部电子元件或电源供应。尽管它们对消费者或子类来说不“可见”或“可用”,但它们仍然存在。
现在,大多数面向对象语言中的构造都反射(reflect)了您所描述的属性(多个对象),并且涉及称为组合(有时,聚合)的设计模式。这是一个类不是从祖先类派生的地方 - 通常是因为该类被声明为“sealed”(C#) 或“final”(Java)(或其他指定)禁止继承)。这迫使有兴趣使用该类的开发人员将其成为另一个类的成员,这样当该类的对象被实例化时,您就可以这样做具有两个类的离散对象。
您可能有以下情况:
public final class InterestingThing
{
//definitions
public InterestingThing()
}
public final class MyThing
{
InterestingThing _interestingThing = new InterestingThing();
public MyThing()
}
这与您在原始问题中描述的场景非常相似,其中 MyThing 的创建意味着 InterestingThing 的独特创建。请记住,这种结构通常是由原始感兴趣类的设计和定义所强制的。
最终,对象是由它们的类定义的,多重继承的类仍然只是一个类,但是是一个基于良好的增量对象设计的精炼的、希望越来越健壮的层次结构。
我希望这个解释能以某种方式帮助回答您的问题。
关于java - 需要明确有关继承的一般概念及其在 OOP 中的实现。请参见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546271/