我有以下课程:
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构造函数中实现所有内容但我想要要知道调用或不调用基础构造函数有什么好处/含义?
由于
答案 0 :(得分: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")
{
}
只有一条代码需要设置错误消息 - 而且我个人实际上是在BusinessRule
内将setter设为私有,或者甚至使用单独的只读字段并且仅提供一个吸气鬼。
答案 1 :(得分:0)
只需创建不带参数的Business Rule()构造函数。在validated()
中调用base()