在c#中调用基类构造函数

03U*_*Usr 1 c# constructor base-class

我有以下课程:

public abstract class BusinessRule
{
    public string PropertyName { get; set; }
    public string ErrorMessage { get; set; }

    public BusinessRule(string propertyName)
    {
        PropertyName = propertyName;
        ErrorMessage = propertyName + " is not valid";
    }

    public BusinessRule(string propertyName, string errorMessage)
        : this(propertyName)
    {
        ErrorMessage = errorMessage;
    }
 }
Run Code Online (Sandbox Code Playgroud)

public class ValidateId : BusinessRule
{
    public ValidateId(string propertyName) : base(propertyName)
    {
        ErrorMessage = propertyName + " is an invalid identifier";
    }

    public ValidateId(string propertyName, string errorMessage)
        : base(propertyName)
    {
        ErrorMessage = errorMessage;
    }

    public override bool Validate(BusinessObject businessObject)
    {
        try
        {
            int id = int.Parse(GetPropertyValue(businessObject).ToString());
            return id >= 0;
        }
        catch
        {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

public class Customer : BusinessObject
{
    public Customer()
    {
        AddRule(new ValidateId("CustomerId"));
    }
 }
Run Code Online (Sandbox Code Playgroud)

在Customer类中,我添加了一个新的业务规则 - 通过调用它的构造函数来验证ValidateId,这很好,但是然后ValidateId的构造函数正在调用基类构造函数,这是我开始有点困惑的地方.

当ValidateId构造函数可以执行我想要实现的操作时,为什么需要调用基类构造函数?ValidateId构造函数和基础构造函数都将错误消息设置为:

这是在基础构造函数中:

        PropertyName = propertyName;
        ErrorMessage = propertyName + " is not valid";
Run Code Online (Sandbox Code Playgroud)

这是在ValidateId构造函数中:

ErrorMessage = propertyName + " is an invalid identifier";
Run Code Online (Sandbox Code Playgroud)

将使用哪一个ErrorMessage向用户显示错误?

另外,如果我删除: base(propertyName)并且不调用基础构造函数,我得到的BusinessRule不包含无参数构造函数错误消息,显然我可以向Businessrule添加无参数构造函数并在ValidateId构造函数中实现所有内容,但我想知道有什么优点/含义调用或不调用基础构造函数?

谢谢

Jon*_*eet 5

当ValidateId构造函数可以执行我想要实现的操作时,为什么需要调用基类构造函数?

总是必须在继承层次结构的每个级别上遍历构造函数- 否则任何"跳过"级别都没有机会初始化自己并验证参数public ValidateId(string propertyName):base(propertyName){ErrorMessage = propertyName +"是无效的标识符"; }.

想象一下,如果你可以创建一个派生的类FileStream,可以跳过现有的FileStream构造函数 - 它代表什么文件?从哪里获取数据?

在我看来,ValidateId(string propertyName)应该实现为:

public ValidateId(string propertyName)
    : base(propertyName, propertyName + " is an invalid identifier")
{
}
Run Code Online (Sandbox Code Playgroud)

只有一个一段代码需要被设置错误消息-而我个人倒实际上使制定者的私人内BusinessRule,甚至可以使用一个单独的只读字段,并只提供一个getter可言.