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构造函数中实现所有内容,但我想知道有什么优点/含义调用或不调用基础构造函数?
谢谢
当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可言.