如果我正在编写一个绘制形状的程序。
abstract class GraphicObject {
abstract void draw();
abstract void resize();
}
然后是一个扩展GraphicObject的子类,名为Circle。
class Circle : GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
这样处理它会有意义吗?当然有些绘图代码会重复吗?
所以:
abstract class GraphicObject {
public virtual void draw()
{
// all objects will need to be drawn in a similar way, do this here.
}
}
然后在我的圈子类中为圆圈做所有独特的东西
public override void draw() {
//Do unique circle drawing stuff here
base.draw();
}
然后在方法结束时调用基本绘制方法来完成。
我很难看到一个场景,我需要真正使用抽象方法,而不是以某种形式重复代码。
答案 0 :(得分:3)
考虑虚方法返回值的情况。考虑用于创建值的工厂样式方法
class Factory {
public abstract Node CreateNode();
}
抽象方法在这里运行良好,因为它没有对Factory
实际产生Node
值的任何责任。相反,它只是声明应该提供Node
。如果您将其设为虚拟方法,则Factory
必须选择默认值。如果它不知道它是什么类型的工厂,它怎么能产生Node
?
public virtual Node CreateNode() {
return ???;
}
答案 1 :(得分:1)
除非你在绘制调用的开头或结尾都有必须为所有形状做的事情,否则你不会把代码放在抽象类中去做。
如果在绘制期间在不同的点上完成了常见的事情,那么你可以将它们放在抽象类中,比如说,受保护的方法;只有继承的类才能调用它们,并且会将该公共代码放在一个地方。
抽象方法的使用是为了确保(1)使用形状的类可以访问这些方法而不知道它拥有哪个子类引用。因此,例如,一个页面可以有一个形状列表,并在每个页面上调用draw(因为它在超类中定义),即使每个页面都是特定的子类形状。如果未在形状中定义draw(),则无法在列表中的每个形状上调用draw。
(我对java更熟悉,并且使用了java术语 - 我认为你更熟悉其他东西,给定继承的格式和“base”的使用。。根据需要进行翻译...)< / p>