抽象类GraphicObject中的draw和resize方法只是在每次另一个对象继承该类时被覆盖,那么为什么要在GraphicObject中包含这两个方法呢?
编辑:我意识到我想要附加的图像没有显示出来,所以这里是:答案 0 :(得分:3)
我认为你错过了一些关于面向对象编程和继承的关键概念。
假设您有一个GraphicObject
课程,其中draw()
和resize()
为抽象方法:
class GraphicObject {
public abstract void draw();
public abstract void resize();
}
当然,这两个emthod声明不是任何可执行代码。它只是意味着:如果您想创建GraphicObject
,必须为这些方法提供实现。但它也为使用GraphicObject
个实例的所有其他类提供了宝贵的提示。
假设您有一个全局Renderer
,它会显示多个GraphicObject
s:
class Renderer {
public void render(List<GraphicObject> objects) {
for (GraphicObject object : objects) {
object.draw();
}
}
}
render()
方法在不知道实现的情况下调用GraphicObject.draw()
。根据{{1}}声明,我们知道存在实施,其签名等。
答案 1 :(得分:1)
正是强制子类重写这些方法并提供一个在超类中保留抽象的实现。像这样的方法可能会被其他操作中的超类调用,看一下想法的模板方法模式。
答案 2 :(得分:1)
抽象类表示接口。它定义了每个子类必须满足的契约,即提供方法及其各自的实现。
答案 3 :(得分:1)
抽象方法,比如接口,说“方法必须与任何真实对象中的此签名一起存在”,但是决定将其实现的位置打开。
抽象类定义一些行为而不是其他行为是很常见的;当一组课程分享某些行为但其他行为不同时,这很有用。同样的理性可以应用于抽象类的子类;它们本身可能是部分抽象的,只填写了从它们派生的类中常见的一些行为。
让超类提供适用于大多数子类的行为的默认实现并且在某些行为中被覆盖的行为也是不常见的。