1

我有以下课程:

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

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

public class Customer : BusinessObject
{
    public Customer()
    {
        AddRule(new ValidateId("CustomerId"));
    }
 }

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

当 ValidateId 构造函数可以做我想要实现的事情时,为什么我需要调用基类构造函数?ValidateId 构造函数和基本构造函数都将错误消息设置为:

这是在基本构造函数中:

        PropertyName = propertyName;
        ErrorMessage = propertyName + " is not valid";

这是在 ValidateId 构造函数中:

ErrorMessage = propertyName + " is an invalid identifier";

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

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

谢谢

4

2 回答 2

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")
{
}

Only one piece of code needs to be setting the error message - and personally I'd actually make the setters private within BusinessRule, or even use a separate readonly field and only provide a getter at all.

于 2012-10-08T10:34:12.010 回答
0

Just create BusinessRule() constructor without paramters. Call base() in validateId()

于 2012-10-08T10:43:52.477 回答