强制从抽象类派生的类来实现构造函数

时间:2019-03-22 12:48:53

标签: c# oop inheritance abstract-class abstract

我有一个自定义例外,如下所示:

public abstract class MyException : Exception
{
    public MyException()
    {
    }

    public MyException(string message) : base(message)
    {
    }

    public MyException(string message, Exception inner) : base(message, inner)
    {

    }

    public abstract HttpStatusCode GetHttpStatusCode();
}

以及派生类:

public class ForbiddenException : MyException
{
    public override HttpStatusCode GetHttpStatusCode()
    {
        return HttpStatusCode.Forbidden;
    }
}

我希望派生类使用或强制实现抽象类中的构造函数格式。

当前使用上述方法,当我尝试创建ForbiddenException时,出现以下错误:

throw new ForbiddenException("Request forbidden");

ForbiddenException does not contain a constructor that takes 1 arguments

我可以手动将构造函数放入MyException的每个派生类中,但这容易出错,并且需要重复我自己。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果要避免在重写时出现复制和粘贴/错误,请考虑使用文本模板。我已将其放置在玩具类库的.tt模板中,还将您的MyException复制到:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
using System;

namespace ClassLibrary2
{

<# StandardConstructors("public","ForbiddenException","MyException"); #>

}
<#+
  public void StandardConstructors(string modifiers,
       string derivedException, string baseException)
    {
        Write(modifiers);
        Write(" partial class ");
        Write(derivedException);
        Write(":");
        WriteLine(baseException);
        WriteLine("{");

        Write("\tpublic ");
        Write(derivedException);
        WriteLine("() {}");

        Write("\tpublic ");
        Write(derivedException);
        WriteLine("(string message):base(message)");
        WriteLine("\t{}");

        Write("\tpublic ");
        Write(derivedException);
        WriteLine("(string message, Exception inner):base(message,inner)");
        WriteLine("\t{}");

        WriteLine("}");
    }
#>

我唯一遇到的错误是我尚未实现GetHttpStatusCode,但是我希望您将其写入一个单独的文件中,该文件也定义了相同的部分ForbiddenException类。每个新的派生异常仅需要您在模板文件中添加另一行StandardConstructors。错误几率大大降低。

当然,您可以根据自己的喜好进行设置,我只是在几分钟之内从头开始编写的。 1

这是上面的模板产生的:

using System;

namespace ClassLibrary2
{

public partial class ForbiddenException:MyException
{
    public ForbiddenException() {}
    public ForbiddenException(string message):base(message)
    {}
    public ForbiddenException(string message, Exception inner):base(message,inner)
    {}
}

}

不太漂亮,但不一定必须-它是生成的代码。


1 例如如果分页/间隔确实让您感到不适,但例如您想更好地控制修饰符等。