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

时间:2009-08-25 02:43:30

标签: c# methods virtual abstract-class override

有这样的事情:

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
  }
}

我读了另一篇文章(abstract method in a virtual class)女巫非常像我的问题,但有一点不同。我希望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
  }
}

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

public class BBB : AAA, IAAA { ... }

但是看起来不对我。

3 个答案:

答案 0 :(得分:5)

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

编辑:

您的“规范”是:

  1. 默认行为
  2. 必填覆
  3. 现在,由于您似乎希望始终执行“默认行为”,因此您需要

    public string ToString()
    {
        // placeholder for some default behaviour
    
        string result = doToString();
    
        // placeholder for some more default behaviour
    
        return result;
    }
    
    protected abstract string doToString();
    

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

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

    您可以记录您的建议,以便始终致电base.ToString(),但这就是它。

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

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

答案 1 :(得分:2)

我刚刚发现了如何做到我想要的行为:

public abstract class AAA
{
  protected abstract string ToStringSpecific();
  protected string ToString()
  {
    // Base Stuff
    ...
    // Use this.ToStringSpecific();
  }
}

public class BBB : AAA
{
  protected override string ToStringSpecific()
  {
    // Specific Stuff
  }
}

答案 2 :(得分:0)

不,不可能将当前的虚函数转换为抽象函数。执行此操作的唯一方法是创建另一个抽象的函数,如您所建议的那样。这可以说是一种更合适的方法(我同意这一点)。