C# 方法必须被重写,但不是';不抽象?

C# 方法必须被重写,但不是';不抽象?,c#,inheritance,C#,Inheritance,我希望在基类中实现一个函数,但我也希望每次都在派生类中重写它。因此,它更像是“抽象的功能,但有一个身体” 我在找什么?我在寻找正确的方法吗?如果基类有话要说,但您希望“每次”都重写它,那么我将有两个方法: public void DoSomething() { //things to do before DoSomethingCore(); //things to do after } protected abstract void DoSomethingCore();

我希望在基类中实现一个函数,但我也希望每次都在派生类中重写它。因此,它更像是“抽象的功能,但有一个身体”


我在找什么?我在寻找正确的方法吗?

如果基类有话要说,但您希望“每次”都重写它,那么我将有两个方法:

public void DoSomething() {
    //things to do before
    DoSomethingCore();
    //things to do after
}
protected abstract void DoSomethingCore();

您正在寻找一个
virtual
方法(使用此修饰符允许覆盖该方法),但不能强制用户覆盖它。如果您有一个body,那么强制这样做是没有意义的,因为您可以只调用base.YourMethod(),而不做其他事情,这与不首先重写该方法的作用相同

public virtual YourMethod() {
   // your base class code here
}
然后是另一个类中的重写方法:

public override YourMethod() {
   // code to do before the base call
   base.YourMethod();
   // code to do after the base call
}
如果您的基类在方法中做了一些事情,但是您希望确保每个子类都被强制实现方法的某个部分,那么您需要,如Marc Gravell的回答中所述

没有办法在基类中提供默认实现,而仍然强制子类提供自己的实现。但是,您可以创建一个抽象基类并从中继承以提供默认实现,但要密封该具体类

public abstract class FooBase {
    public abstract void DoStuff();
}

public sealed class FooImpl : FooBase {
    public override void DoStuff {
        //default widget-munging code
    }
}
现在,从FooBase继承的任何类都必须实现DoStuff(),但您有一个默认的实现FooImpl,子类不能从中继承

您可能还希望将实现该方法的责任委托给一个单独的类,该类在其构造函数中传递给基类。这就是所谓的

现在,您不再对Foo进行子类化,而是创建IFooStrategy接口的新实现,并将其传递给Foo实例。因此,您可以:

new Foo(Foo.DefaultStrategy);


听起来您的基本实现永远不会被调用。为什么您要提供一个没有人能够实现的实现(即使在困难重重的情况下也无法实现)

并且您可能想提及模板方法模式(或者您可能为了简洁起见而拍摄了一些内容),“虚拟”呢DoSomething方法之前的关键字?@Kamarey DoSomething方法不是虚拟的:子类希望覆盖/实现的是DoSomethingCore方法。
new Foo(Foo.DefaultStrategy);
new Foo(new DifferentStrategy());