如何使用方法实现基类并强制派生类重写它?

Tip*_*ipx 5 c# methods virtual abstract-class overriding

有这样的事情:

public abstract class AAA
{
  protected abstract virtual string ToString()    // Error
  {
    // Base Stuff
  }
}

public abstract class BBB : AAA
{
  public override string ToString()
  {
    // Use base.ToString();
    // More Stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

我读了另一篇文章(虚拟课堂中的抽象方法)女巫很像我的问题,但是有一点不同.我希望AAA.ToString()具有基本行为强制派生类覆盖它.

我知道我可以做这样的事情(向下滚动)但我正在寻找一种正确的方法.

public abstract class AAA
{
  public abstract string ToString();
  protected string ToString2()
  {
    // Base Stuff
  }
}

public class BBB : AAA
{
  public override string ToString()
  {
    // Use base.ToString2();
    // More Stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

我也可以创建一个IAAA接口并构建我的BBB类

public class BBB : AAA, IAAA { ... }
Run Code Online (Sandbox Code Playgroud)

但是看起来不对我.

Nad*_*zie 5

你的方法基本正确的方式...

编辑:

你的"规范"是:

  1. 默认行为
  2. 必需的覆盖

现在,由于您似乎希望始终执行"默认行为",因此您需要

public string ToString()
{
    // placeholder for some default behaviour

    string result = doToString();

    // placeholder for some more default behaviour

    return result;
}

protected abstract string doToString();
Run Code Online (Sandbox Code Playgroud)

这只有在您知道基类正在执行的操作并且希望doToString()在派生类中提供实现时才有效.这称为模板方法设计模式.

但是,如果您正在寻找一种方法来要求派生类的实现者base.ToString()在其实现中调用ToString(),那么就没有办法做到这一点.通过允许覆盖,您可以为其实现提供派生类控件.

您可以将您的建议记录为始终致电base.ToString(),但就是这样.

使用接口定义您的类的公共合同.与模板方法模式相比,这不会带来任何额外的好处,因为您仍需要从基类派生以获得"默认"实现.

您是否有任何有关您尝试在基类中提供的"默认行为"的详细信息?也许这将有助于找到更好的解决方案.看看引用的问题,这基本上是相同的方法.