禁止覆盖调用 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())
{
}
}
有点冗长,但有效。
我想做这样的事情:
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())
{
}
}
有点冗长,但有效。