禁止来自呼叫基地的覆盖

Wil*_*sch 1 c# overriding virtual-functions subclassing

我想做这样的事情:

public class MyClass {
  public virtual void Foo() {
    this.DoSomethingThatWouldBeFineInASubclassButAnOverrideWouldNotWantToUse();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

dca*_*tro 6

这可以通过组合而不是继承来更好地解决.也许,使用策略模式:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

子类:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

有点冗长,但有效.

  • "用组合代替继承更好地解决了" - 如果我能给你+100,我会:) (4认同)