【问题标题】:Forbid overrides from calling base禁止调用基址的覆盖
【发布时间】:2023-04-04 00:05:01
【问题描述】:

我想做这样的事情:

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

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

【问题讨论】:

  • 您可以使用new-关键字来隐藏基本实现。
  • 如果您将DoSomethingThatWouldBeFineInASubclassButAnOverrideWouldNotWantToUse设为私有会怎样?那么只能从MyClass调用
  • @NedStoyanov 但是你仍然可以打电话给base.Foo()
  • 啊哈,我的错。恕我直言,我认为这是不可能的。拥有Foo virtual 使其对子类可见,因此他们可以覆盖它。如果他们可以覆盖它,他们就可以调用它。
  • 我有问题,我用继承“解决”它;我现在遇到的问题呈指数级增长......

标签: c# overriding subclassing virtual-functions


【解决方案1】:

这最好用组合而不是继承来解决。也许,使用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())
    {

    }
}

有点冗长,但有效。

【讨论】:

  • “这最好用组合而不是继承来解决” - 如果我能给你+100,我会:)
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2013-07-10
  • 2021-09-06
  • 2012-10-12
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多