摘要与常规超级班级

3lg*_*irt 5 oop

如果我可以用抽象类做一切,我可以使用常规超类,那么为什么我可以在使用常规超类时使用抽象类?

Mic*_*haC 12

我认为这些评论和答案已经暗示了这一点,但我想直截了当地说明:你不能用一个普通的超类做一切,你可以用抽象类做.抽象类允许您定义方法的签名而不包括其实现,并且抽象类将不允许您直接实例化它.

因此,如果我有3个方法的类签名,并且我不想共享其中任何一个的实现,我将使用一个接口.如果我想分享其中一个方法的实现,我将使用一个抽象类,然后在该类抽象中创建两个方法.如果我想要共享方法的所有实现,我将使用抽象类,如果直接实例化它是没有意义的,或者如果它实际上我将使用常规类.

(这是基于我在C#中的经验.语言之间的细节不同.)


Dav*_*nco 1

基类提供自己的方法实现。这些实现有时可以被覆盖(取决于语言)。

抽象类不提供默认实现,每个继承类都需要根据具体情况实现这些方法。

上述详细信息可能因语言而异。阅读相应的文档。

考虑这个例子:
抽象 类Number有一个add()方法。AOddNumberEvenNumber子类需要实现几乎相同的add()方法,因此存在一些代码重复。在这里,拥有一个超类更有意义(或者至少拥有一个 的RealNumber子类Number)。

但是,如果数字不是抽象的,请考虑Complex作为子类,(假设它是实数加法算法)中找到的方法对于复数没有意义。这里抽象类更有意义。有些语言允许您重写超类方法,但在这种情况下这有点尴尬。Numberadd()Number