禁止覆盖调用 base

Forbid overrides from calling base

我想做这样的事情:

public class MyClass {
  public virtual void Foo() {
    this.DoSomethingThatWouldBeFineInASubclassButAnOverrideWouldNotWantToUse();
  }
}

基本上,我在这里做一些工作,我想要一个默认的方式来做这件事,但如果有人要覆盖,他们可能不会使用默认方式。不用考虑就可以很容易地将 base.Foo() 放入覆盖中;事实上,我的 IDE 会自动完成。我想阻止这种情况。可能吗?

使用组合而不是继承可以更好地解决这个问题。也许,使用 strategy pattern:

interface ISomeStrategy
{
    void Do();
}

public class MyClass {

    private readonly ISomeStrategy _strategy;

    public MyClass() : this(null) {}

    public MyClass(ISomeStrategy strategy)
    {
        // the default implementation and the user-defined implementation
        // are mutually exclusive
        _strategy = strategy ?? new DefaultStrategy();
    }

    public void Foo()
    {
        _strategy.Do();
    }

    //secret strategy
    private class DefaultStrategy : ISomeStrategy
    {
        public void Do()
        {
            //secret implementation
        }
    }
}

子类化:

public class Derived : MyClass
{
    public Derived() : base(new DerivedStrategy())
    {

    }
}

有点冗长,但有效。