我想做这样的事情:
public class MyClass {
public virtual void Foo() {
this.DoSomethingThatWouldBeFineInASubclassButAnOverrideWouldNotWantToUse();
}
}
基本上,我在这里做了一些工作,我想要一个默认的方法,但如果有人要覆盖,他们可能不会使用默认值。将base.Foo()放入覆盖中而不考虑它是如此容易;实际上我的IDE会自动完成。我想防止这种情况。有可能吗?
答案 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())
{
}
}
有点冗长,但有效。