2

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

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

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

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

4

2 回答 2

3

考虑虚拟方法返回值的情况。考虑一种用于创建值的工厂样式方法

class Factory { 
  public abstract Node CreateNode(); 
}

抽象方法在这里工作得很好,因为它不承担任何Factory实际产生Node值的责任。相反,它只是声明Node应该提供一个。相反,如果您将其设为虚拟方法,则Factory必须选择默认值。Node如果它不知道它是什么类型的工厂,它如何生产?

public virtual Node CreateNode() { 
  return ???;
}
于 2013-08-25T02:34:08.490 回答
1

除非您必须在绘制调用的开始或结束时对所有形状执行某些操作,否则您不会将代码放在抽象类中来执行此操作。

如果在绘图期间有一些共同的事情要在不同的时间完成,那么您可以将它们放在抽象类中,例如受保护的方法;只有继承的类才能调用它们,这会将公共代码放在一个地方。

抽象方法的使用是为了确保 (1) 使用形状的类可以访问这些方法,而无需知道它引用了哪个子类。因此,例如,一个页面可以有一个形状列表,并在每个形状上调用 draw(因为它是在超类中定义的),即使每个形状都是特定的子类形状。如果 draw() 未在 shape 中定义,则不能对列表中的每个 shape 调用 draw。

(我更熟悉 java 并且使用过 java 术语——我猜你对其他东西更熟悉,考虑到你的继承格式和“base”的使用。根据需要翻译......)

于 2013-08-25T02:32:14.273 回答