2015-12-18 14 views
6

मेरे पास एक ऐसा एप्लिकेशन है जहां मूल ऑब्जेक्ट में सत्यापन करने के लिए एक विधि है और प्रत्येक बच्चा अतिरिक्त सत्यापन करने के लिए विधि को ओवरराइड करता है। की तरह कुछ:सशर्त रूप से ब्लॉक विधि ओवरराइड

class Parent { 
    virtual void DoValidations (Delegate addErrorMessage) { 
     //do some validations 
    } 
} 

class Child : Parent { 
    override void DoValidations (Delegate addErrorMessage) { 
     base.DoValidations(addErrorMessage); //the parent method is always called 
     //do some extra validations 
    } 
} 

मैं एक नया "IsDisabled" संपत्ति है कि जब सच विधि किसी भी सत्यापन प्रदर्शन नहीं करेगा गयी।

class Parent { 
    boolean IsDisabled; 

    virtual void DoValidations (Delegate addErrorMessage) { 
     if (IsDisabled) 
      return; 
     //do some validations 
    } 
} 

मैं भी है कि हर बच्चे के लिए, यदि "IsDisabled" संपत्ति सच है, अतिरिक्त सत्यापन नहीं की जाती है चाहता हूँ। यहां उपयोग करने के लिए बेहतर पैटर्न क्या है?

उत्तर

6

मैं एक अलग विधि में है कि कार्यक्षमता अलग हो जाएगा:

private void DoValidations(Delegate addErrorMessage) 
{ 
    if (!this.IsDisabled) 
    { 
     this.OnDoValidations(addErrorMessage); 
    } 
} 

virtual void OnDoValidations(Delegate addErrorMessage) { } 

अब, OnDoValidations होगा पर अधिरोहित जा सकता है। बेस क्लास के अंदर IsDisabled चेक किया जाएगा।

+0

शायद, 'DoValidations' 'public' होना चाहिए। –

+0

मुझे नहीं पता। ओपी के लिए यह पता लगाने के लिए है। –

+0

हां, ज़ाहिर है। –

0

अच्छा, यह सोलिड 'एल' (लिस्कोउ प्रतिस्थापन सिद्धांत) से संबंधित है। मेरा सुझाव है कि आप निम्नलिखित दृष्टिकोण का उपयोग करने के लिए:

1) इंटरफ़ेस बनाएँ, उदाहरण के लिए:

public IValidator { 
    void Validate(Delegate addErrorMessage); 
} 

2) सार DoValidations साथ सार आधार वर्ग बनाएं() विधि:

public abstract class BaseValidator : IValidator { 
    public void Validate(Delegate addErrorMessage) { 
    DoValidations(addErrorMessage); 
    } 

    protected abstract DoValidations(Delegate addErrorMessage); 
} 

3) BaseValidator से अभिभावकीय वारिस (या BaseValidator के बजाय आधार वर्ग के रूप में अपने माता पिता के बनाने):

public class Parent: ValidatorBase { 
    public override void DoValidations(Delegate addErrorMessage) { 
    // do validation 
    } 
} 

4) जनक से बाल उत्तराधिकार:

public class Child : Parent { 
    public override void DoValidations(Delegate addErrorMessage) { 
    // do validation 
    } 
} 

5) अब यह IsDisabled संपत्ति जोड़ने के लिए समय है। हम सिर्फ संशोधित करने के लिए ValidatorBase और IValidator की जरूरत है:

validator.IsDisabled = false; 
validator.Validate(); 

गुड लक:

public interface IValidator { 
    bool IsDisabled {get; set; } 
    void Validate(Delegate addErrorMessage); 
} 

public abstract class BaseValidator : IValidator { 

    public bool IsDisabled { get; set; } 

    public void Validate(Delegate addErrorMessage) { 
    if(!IsDisabled) { 
     DoValidations(addErrorMessage); 
    } 
    } 

    protected abstract DoValidations(Delegate addErrorMessage); 
} 

6) अब आप अपने IValidator सत्यापनकर्ता = _factory.Create() का उपयोग करें!

संबंधित मुद्दे