मैं एक .NET वेब एप्लिकेशन लिख रहा हूं जिसमें प्रशासक अपने उपयोगकर्ताओं को प्रस्तुत विभिन्न डेटा प्रविष्टि फ़ॉर्म को कस्टमाइज़ कर सकते हैं। लगभग आधे दर्जन विभिन्न फ़ील्ड प्रकार हैं जो व्यवस्थापक बना सकते हैं और अनुकूलित कर सकते हैं (यानी टेक्स्ट, न्यूमेरिक, ड्रॉपडाउन, फ़ाइल अपलोड)। सभी फ़ील्ड बेस विशेषताओं/व्यवहारों का एक सेट साझा करते हैं (क्या फ़ील्ड आवश्यक है? क्या इसमें डिफ़ॉल्ट फ़ील्ड मान होगा?)। फील्ड विशिष्ट विशेषताओं/व्यवहारों की एक श्रृंखला भी है (यानी ड्रॉपडाउन में डेटा स्रोत विशेषता है, लेकिन टेक्स्ट फ़ील्ड नहीं है)। मैं सादगी के लिए समस्या डोमेन की कई अन्य विशेषताओं को छोड़ रहा हूं।विधि ओवरलोडिंग और पॉलिमॉर्फिज्म
कक्षा पदानुक्रम सरल है: एक अमूर्त सुपरक्लास जो सामान्य व्यवहार/विशेषताओं को घेरता है और लगभग आधे दर्जन ठोस उपखंड जो क्षेत्र विशिष्ट सामग्री से निपटते हैं।
प्रत्येक फ़ील्ड प्रकार को एक विशिष्ट प्रकार के .NET सर्वर नियंत्रण के रूप में प्रस्तुत किया जाता है (यानी मैप किया गया), जिनमें से सभी System.Web.UI.Control से प्राप्त होते हैं।
मैं क्षेत्र डोमेन वस्तुओं और उनकी इसी UI नियंत्रण के बीच मान मैप करने के लिए निम्न कोड बनाया:
public static void Bind(Control control, IList<DocumentFieldBase> fieldBaseList)
foreach (DocumentFieldBase fieldBase in fields){
if (typeof (DocumentFieldText).IsInstanceOfType(fieldBase)){
TextBox textbox = (TextBox) control;
textbox.Text = (fieldBase as DocumentFieldText).GetValue();
}
if (typeof (DocumentFieldDropDown).IsInstanceOfType(fieldBase)){
DropDown dropDown= (DropDown) control;
dropDown.Text = (fieldBase as DocumentFieldSelectOne).GetValue().Text;
dropDown.DataSource= (fieldBase as DocumentFieldSelectOne).DataSource;
dropDown.Id= (fieldBase as DocumentFieldSelectOne).GetValue().Id;
}
//more if statements left out for brevity
}
}
मैं उन बयानों उस प्रकार की जाँच प्रदर्शन करता है, तो धर्मभ्रष्ट खाई करने के लिए चाहते हैं। जिस दृष्टिकोण के लिए मैं शूटिंग कर रहा था वह सबक्लास टाइपिंग का उपयोग करके क्षेत्र/नियंत्रण के प्रत्येक संयोजन के लिए एक विधि ओवरलोड बनाना था। उदाहरण के लिए:
public static void Bind(TextBox control, DocumentFieldText fieldText){
//some implementation code
}
public static void Bind(DropDown control, DocumentFieldDropDown fieldDropDown){
//some implementation code
}
मुझे उम्मीद थी कि मैं तो क्रम पर उचित अधिभार कॉल करने के लिए विशिष्ट उपवर्ग का उपयोग कर नेट पर भरोसा कर सकता है इस्तेमाल किया जा रहा: उदाहरण के लिए:
foreach (DocumentFieldBase field in fields){
Control control = FindControl(field.Identifier);
Bind(control, field)
}
दुर्भाग्य से, जब मैं इसे आज़माता हूं तो संकलक चॉक: तर्क '1': 'System.Web.UI.Control' से 'टेक्स्टबॉक्स' में परिवर्तित नहीं हो सकता है।
यदि मुझे टेक्स्टबॉक्स में पहला तर्क डालना है, तो मैं अपने आप को जांचने के लिए वापस आ रहा हूं और इस अभ्यास के पूरे उद्देश्य को हरा देता हूं।
क्या मैं एक प्राप्त करने की कोशिश कर रहा हूं) संभव है और बी) एक अच्छा विचार?
उत्तर दिया गया क्योंकि आपने मेरा दर्द एक नाम दिया :) मैंने अक्सर डबल प्रेषण और विज़िटर पैटर्न के बारे में पढ़ा है और उस समस्या का सामना करना पड़ा जिसकी मैं समस्या कर रहा था (इसलिए आपके द्वारा उल्लेख किया गया "प्रेषण" टैग)। आपने एकल प्रेषण और एकाधिक प्रेषण के बीच महत्वपूर्ण अंतरों को दूर करने में भी कामयाब रहा है, इस विषय पर मैंने जो कुछ लेख पढ़े हैं, वह कुछ नहीं कर सका। –