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

C# 什么时候我真的需要使用抽象方法?,c#,java,class,polymorphism,abstract,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 {

    abstract void draw();
    abstract void resize();
}
然后是扩展GraphicObject的子类,称为Circle

class Circle : GraphicObject {
    void draw() {
    ...
    }
    void resize() {
        ...
    }
}
这样处理有意义吗?肯定会重复一些绘图代码吗

因此:

然后在我的圆圈课上,做所有独特的事情

public override void draw() {
    //Do unique circle drawing stuff here
    base.draw();
}
然后在方法末尾调用base draw方法以完成


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

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

如果在绘制过程中有在不同点完成的常见操作,那么您可以将它们放在抽象类中,比如说,受保护的方法中;只有继承的类才能调用它们,这将把公共代码放在一个地方

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


(我更熟悉java,也使用过java术语——考虑到您的继承格式和“base”的使用,我想您对其他方面更为熟悉。根据需要进行翻译…

除非您在draw调用的开始或结束时必须对所有形状执行某些操作,那么你就不会把代码放在抽象类中去做了

如果在绘制过程中有在不同点完成的常见操作,那么您可以将它们放在抽象类中,比如说,受保护的方法中;只有继承的类才能调用它们,这将把公共代码放在一个地方

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


(我更熟悉java,也使用过java术语——考虑到您的继承格式和“base”的使用,我想您对其他方面更熟悉。根据需要进行翻译…

考虑虚拟方法返回值的情况。考虑用于创建值

的工厂样式方法。
class Factory { 
  public abstract Node CreateNode(); 
}
抽象方法在这里工作得很好,因为它不会让
工厂负责实际生成
节点
值。相反,它只是声明应该提供一个
节点。如果您将其设置为虚拟方法,则
Factory
必须选择一个默认值。如果它不知道它是什么类型的工厂,它如何生成
节点

public virtual Node CreateNode() { 
  return ???;
}

考虑虚拟方法返回值的情况。考虑用于创建值

的工厂样式方法。
class Factory { 
  public abstract Node CreateNode(); 
}
抽象方法在这里工作得很好,因为它不会让
工厂负责实际生成
节点
值。相反,它只是声明应该提供一个
节点。如果您将其设置为虚拟方法,则
Factory
必须选择一个默认值。如果它不知道它是什么类型的工厂,它如何生成
节点

public virtual Node CreateNode() { 
  return ???;
}