abstract methods and classes: Concept behind?
抽象类背后的整个概念究竟是什么?(在我的例子中,我指的是Java)。我理解这样一个事实,即它太笼统了,不能自己实现,因此没有用处。但是可以肯定的是,仅仅声明它是非抽象的,并且使用相同的继承(如果它是一个抽象类的话,会使用相同的继承)就可以得到相同的结果。
在没有方法体的抽象超类中声明抽象方法,然后在其子类中重写它们,这样做的主要优点是节省时间吗?
- 您所要求的大部分内容都解释在这里:docs.oracle.com/javase/tutorial/java/iandi/abstract.html
主要的优点是不能实例化抽象类。您可能有这样的类Document:
1 2 3 4 5 6 7 8
| public class Document {
public void write (File file ) {
// I have no idea how to implement this
}
public void read (File file ) {
// I don't know here either
}
} |
您希望人们为其文档类型创建子类:
1 2 3 4 5 6 7 8
| public class MyDocument extends Document {
public void write (File file ) {
// Now I know how to implement
}
public void read (File file ) {
// this also can be implemented
}
} |
但你不希望人们制造新的Documents:
你想让人们做这样的事情:
解决方案是将EDOCX1[0]抽象为:
并使方法抽象化:
1 2
| public abstract void write (File file );
public abstract void read (File file ); |
然后你不能实例化Document,但是你可以实例化子类。子类必须覆盖read和write。
假设您的基类有一个必须在任何有用的子类中重写的方法。如果在基类中实现该方法,并且该方法未被重写,则在运行虚拟方法体之前,将找不到该错误。如果将方法和类抽象,则在编译时会发现错误。
- 是的,所以它有点像一个安全机制?抽象类中的所有方法是否都需要抽象,即命名为抽象?
- 不,只有那些你想要抽象的
- 一旦有了一个抽象方法,就需要将类声明为抽象的
- 我建议阅读关于抽象类和方法的内容
- 我认为它还增加了可读性。将一个方法声明为抽象的,而不提供方法体,与提供一个带有指示必须重写的注释的伪方法相比,是一个更清晰的非实现表达式。
把抽象类看作是在API中创建契约的一种方法。
假设您正在创建一个程序,该程序包含商店销售的商品列表。现在这个列表当然会包含一些项目,它们将具有某些共同的特性和特定的个人特性。然而,我们不能出售"物品"——我们想出售"电视"或"桌子"。
因此,您将创建一个抽象类"item",它具有价格标签、生产日期等,但是您不希望任何人创建类item的实例,因为一个项可以是任何东西。
您希望程序员对item类型进行子类化和创建自己的类,以完全满足item所需的契约。反过来,API允许您添加子类item的类,将其放到可用项的存储列表中。这还将自动为这些类提供在子类化时不需要考虑的功能,并要求您重写必须为类实现的方法。
在Java中,方法不需要抽象,在抽象类中,并且可以像普通类一样实现。例如,如果您有一个orice标签,您可以为这个价格标签实现一个getter——不需要强制子类实现这个。
希望这是有道理的。另外,请随时发表评论,以便我详细阐述。
- 我想我开始得到它了,谢谢,它基本上是为了控制,比如尝试和控制实现了什么方法等等,以及不浪费时间为一个超类编写方法,这个超类一般来说是没有用处的。另外,我能问一下OOP中的大多数超类是否都是抽象的吗?似乎这是最明智的做法,因为大多数能够拥有许多子类的事情通常都非常普遍?
- 摘要,根据它的定义,是关于一般性的。如果我告诉你我有一只宠物,你只会知道我有一只宠物,但不知道是哪只。如果我说我有一只狗,那么我们会变得更加具体,但你只能想象我有什么样的宠物。如果我告诉你我有柯基犬,你会突然知道我有什么宠物。可以将Java动物声明为接口,而狗可能是抽象类,其中CORGI是普通类。
- 为什么这么有趣?嗯,我的公寓可能不允许养动物宠物,因此排除了任何种类的动物,或者允许猫而不是狗,使用某些种类的动物,但不允许其他动物。抽象类型和一般性用于指定规则和合同。
- 至于界面与抽象部分:我们可以说,动物一般需要进食和繁殖。他们如何做到这一点对我们所谈论的动物是非常具体的,因此不能说如何(例如,Java中的这些方法可以通过它们的定义来实现)。然而,我们可能会为狗实施这些,因为它们的食物和繁殖方式在所有狗种中或多或少是相同的。
当你不想创建一个类的对象时,你可以将它抽象化,并且子类的公共方法可以在抽象的超类中实现,另一个目的是把方法抽象化,这样子类就必须实现超类的抽象方法来编写自己的实现。就这么简单。