2012-10-08 79 views
1

我有以下类别:呼叫基类构造函数在C#

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

从客户类中我增加了新的业务规则 - ValidateId通过调用它的构造函数,这很好,但是然后ValidateId的构造函数调用基类的构造函数,th是我开始有点困惑的地方。

为什么我需要调用基类构造函数,当ValidateId构造函数可以做我想要实现的?而且两者ValidateId构造和基本构造是错误消息设置的东西:

这是基类的构造:

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

,这是ValidateId构造:

ErrorMessage = propertyName + " is an invalid identifier"; 

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

另外,如果我删除: base(propertyName)而不是调用基类的构造我得到BusinessRule不含参数的构造函数的错误消息,很明显,我可以再补充一个无参数的构造函数的Businessrule和执行ValidateId构造的一切,但我想知道是什么调用或不调用基础构造函数的优点/含义?

感谢

回答

5

为什么我需要调用基类的构造函数时ValidateId构造可以做什么,我想达到什么目的?

总是必须通过在级继承层次的构造函数去 - 否则任何“跳过”的水平不会有机会初始化自己和验证参数公众ValidateId(串propertyName):base(propertyName) { ErrorMessage = propertyName +“是一个无效的标识符”; }。

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

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

public ValidateId(string propertyName) 
    : base(propertyName, propertyName + " is an invalid identifier") 
{ 
} 

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

+0

感谢您的解释。 – 03Usr

0

只需创建没有参数的BusinessRule()构造函数。呼叫基地()在validateId()