禁止来自呼叫基地的覆盖

时间:2015-06-01 11:46:54

标签: c# override subclassing virtual-method

我想做这样的事情:

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

基本上,我在这里做了一些工作,我想要一个默认的方法,但如果有人要覆盖,他们可能不会使用默认值。将base.Foo()放入覆盖中而不考虑它是如此容易;实际上我的IDE会自动完成。我想防止这种情况。有可能吗?

1 个答案:

答案 0 :(得分:6)

使用合成而不是继承可以更好地解决这个问题。也许,使用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())
    {

    }
}

有点冗长,但有效。