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

エラー メッセージを設定する必要があるコードは1 つだけです。個人的には、実際には 内BusinessRuleでセッターを非公開にするか、別の読み取り専用フィールドを使用してゲッターのみを提供します。

于 2012-10-08T10:34:12.010 に答える
0

パラメータなしで BusinessRule() コンストラクタを作成するだけです。validateId() で base() を呼び出します

于 2012-10-08T10:43:52.477 に答える