我什么时候真的需要使用抽象方法?

时间:2013-08-25 02:22:02

标签: c# java class polymorphism abstract

如果我正在编写一个绘制形状的程序。

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();
}

然后在方法结束时调用基本绘制方法来完成。

我很难看到一个场景,我需要真正使用抽象方法,而不是以某种形式重复代码。

2 个答案:

答案 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>