2009-09-20 9 views
6

में उपयोगकर्ता नियंत्रण और पृष्ठों के लिए सामान्य आधार वर्ग अभी मेरे पास मेरे पृष्ठों के लिए बेस क्लास है जो System.Web.UI.Page और मेरे उपयोगकर्ता नियंत्रण के लिए एक और आधार वर्ग है जो System.Web.UI.UserControl प्राप्त करता है, इन वर्गों में समान विधियां होती हैं। चूंकि सी # एकाधिक विरासत का समर्थन नहीं करता है, इसलिए मैं दो वर्गों को उस पृष्ठ में जोड़ नहीं सकता जो पृष्ठ और उपयोगकर्ता नियंत्रण दोनों को प्राप्त करता है।ASP.NET

दो आधार वर्गों में कार्यक्षमता रखने का सबसे अच्छा तरीका क्या होगा लेकिन इन तरीकों का कार्यान्वयन केवल एक ही स्थान पर होगा?

मैं एक इंटरफेस बनाने की सोच रहा हूं और दो बेस क्लास को एक तीसरी कक्षा में कॉल करने देता हूं जिसमें इंटरफ़ेस के कार्यान्वयन शामिल हैं। क्या कोई बेहतर तरीका है ताकि जब मैं एक नई विधि जोड़ूं तो मुझे इसे तीन स्थानों पर नहीं करना पड़ेगा (भले ही कार्यान्वयन केवल तीसरी कक्षा में है)।

+0

क्या कोई कारण है कि आप केवल एक सहायक वर्ग नहीं बनाते जो कि कन्स्ट्रक्टर में एक HttpContext स्वीकार करता है? यह आपको क्वेरी स्ट्रिंग को देखने और प्रतिक्रिया देने के लिए चीजों को करने की क्षमता देगा। रेडियोधर्ड्स। – nizmow

+0

मूल प्रश्न httpContext के बारे में है, यह पेज बेस क्लास (एक सामान्य उपयोग केस) में कस्टम कोड के बारे में है जो पृष्ठों और उपयोगकर्ता नियंत्रणों के बीच DRY है। यह काफी संभावना है कि प्रश्न में विधियां व्यवसाय तर्क के लिए विशिष्ट हैं और http संदर्भ के साथ कुछ भी नहीं है। –

उत्तर

9

यदि आप सी # 3.0 का उपयोग कर रहे हैं, तो आप System.Web.UI.Control कक्षा के लिए विस्तार विधियों के रूप में अपने सहायक तरीके प्रदान कर सकते हैं, जिनमें से System.Web.UI.Page और System.Web.UI.UserControl कक्षाएं प्राप्त होती हैं।

public static class ControlExtensions { 
    public static void DoSomething(this Control obj) { 
     // do something 
    } 
} 

Page या UserControl में:

this.DoSomething(); 
+0

महान उत्तर @Mehrdad! – ProfK

1

हम्म ... प्रसिद्ध हेल्पर वर्गों के उपयोग की तरह लगता है, मूल रूप से

public static class StringHelper 
{ 

    public static string Replace(...) 
    { 
     ... 
    } 

} 

तरह वर्गों और उन्हें

तरह बुला
string x = StringHelper.Replace(...); 

हालांकि मैं अक्सर इन सहायकों में से बहुत अधिक होने के बारे में चिंतित हूं क्योंकि वे वास्तव में किसी भी तरह से प्रक्रियात्मक प्रोग्रामिंग को उन में स्थिर तरीकों के साथ याद करते हैं। दूसरी तरफ, इस तरह की कार्यक्षमता जैसा कि आप इसका वर्णन करते हैं (कुछ आधार वर्ग जो उपयोगकर्ता नियंत्रण और पृष्ठ को बढ़ाते हैं) आमतौर पर इस प्रकार के होते हैं।

जो मैं अक्सर करता हूं वह स्ट्रिंगहेल्पर और संबंधित स्ट्रिंग एक्स्टेंडर है जो अंदर तर्क है, हेल्पर क्लास की स्थिर विधियों को कॉल करता है। इस तरह आप नई सी # एक्सटेंशन विधियों या सीधे सामान्य श्रेणी के माध्यम से कार्यक्षमता का उपयोग कर सकते हैं।

3

मेरे पास बिल्कुल वही समस्या है। मेरा समाधान यहाँ है।

मैं खाली इंटरफेस परिभाषित

public interface ISecurableWebObject 
    { 
    } 

तब मैं श्रेणी से ऊपर

public static class ISecurableWebObjectExtender 
    { 
     public static bool ExtensionMetotX(this ISecurableWebObject obj) 
     { 
      return ...; 
     } 
    } 

मैं पृष्ठ और WebUserControl कक्षाएं तो dublicate परिभाषा चला गया है में ISecurableWebObject विरासत में मिला इंटरफेस के लिए extesion तरीकों है कि परिभाषित किया।

public partial class UcExample : System.Web.UI.UserControl, ISecurableWebObject 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if(this.ExtensionMetotX() == true) 
      { ... } 
     } 
    }