2010-08-30 13 views
22

.NET में आप कितने कक्षाएं प्राप्त कर सकते हैं?सी # में आप कितने वर्ग प्राप्त कर सकते हैं?

कई बैकएंड सी # फाइलें हैं जिन्हें मैं अलग-अलग स्थैतिक तरीकों को साझा करना चाहता हूं, लेकिन वे सभी अलग-अलग वर्गों में हैं। क्या कई वर्गों का उत्तराधिकारी करने का कोई तरीका है?

उदाहरण कोड की बहुत सराहना की जाएगी।

+0

आपके द्वारा संरचित कोड कैसा है? क्या आप एक वर्ग से स्थैतिक तरीकों को कॉल करने की कोशिश कर रहे हैं या आप कुछ अलग करने की कोशिश कर रहे हैं? यदि आप एक साथ स्थैतिक तरीकों का समूह समूह बनाने की कोशिश कर रहे हैं, तो इंटरफेस आपकी मदद नहीं करेगा। –

+1

क्योंकि विधियां स्थैतिक (सार्वजनिक रूप से उभरती हैं) आप किसी भी समय किसी भी कक्षा से उन्हें एक्सेस कर सकते हैं, किसी ऑब्जेक्ट को "स्थिर" करने की आवश्यकता नहीं है ताकि वह इसके स्थिर तरीकों का उपयोग कर सके। –

+0

@zach मुझे लगता है कि इनमें से अधिकतर उपयोगिता स्थैतिक विधियों की श्रेणी में आ जाएंगे जिनका उपयोग कक्षाओं के पीछे कई अलग-अलग कोडों द्वारा किया जाएगा। मैं आम तरीकों का उपयोग उसी तरह कर रहा हूं जैसे मैथ क्लास का उपयोग करता हूं। – locoboy

उत्तर

32

सी # एकाधिक विरासत का समर्थन नहीं करता है (जिसका मतलब है कि कई वर्गों से एक एकल वर्ग विरासत में मिलता है)। हालांकि, आप एक ही कक्षा में कई इंटरफेस लागू कर सकते हैं।

जहां तक ​​विरासत में एकत्रित कक्षाएं मिलती हैं, वहां प्रति सीमा नहीं है। बस उस जटिलता को ध्यान में रखें जो आप अपने सिस्टम से पेश करेंगे। विरासत का उपयोग करते समय, सुनिश्चित करें कि आप इसे "एक" परिदृश्य में उपयोग कर रहे हैं। एक चीता एक जानवर है। एक मज़दा एक कार है। अन्यथा, आपकी विरासत कड़ाई से आपके वर्गों को ऐसे डिज़ाइन से जोड़ती है जो बनाए रखने के लिए और अधिक कठिन हो जाती है।

यदि वे स्थैतिक "उपयोगिता" विधियां हैं, तो उन्हें विरासत के बिना सीधे आमंत्रित करें। जब तक कि वे विधियां आपके द्वारा बनाई गई इकाई से संबंधित न हों, आपको विरासत का उपयोग नहीं करना चाहिए।

+0

@jordan अधिकांश विधियों का उपयोग मैं कक्षाओं में से किसी एक से उपयोग कर रहा हूं उपयोगिता विधियां हैं। यदि यह मामला है, तो आप कैसे अनुशंसा करेंगे कि मैं विरासत का उपयोग/उपयोग नहीं कर रहा हूं। – locoboy

+5

इस मामले में बस StaticClassName.StaticMethodName (...) का उपयोग कर रहे वर्ग के अंदर करें। आपको इस परिदृश्य के लिए विरासत की आवश्यकता नहीं है। एक साधारण कॉल ठीक काम करेगा। विरासत का उपयोग केवल उन नए वर्गों को बनाने के लिए किया जाना चाहिए जो माता-पिता वर्ग के अधिक "विशेष" प्रकार हैं - क्लाइंट क्लास के बाहर विधियों तक पहुंच प्रदान न करें। –

15

आप केवल एक ही कक्षा से उत्तराधिकारी हो सकते हैं। हालांकि कई इंटरफेस लागू करना संभव है।

+2

हालांकि यह सही है, मुझे नहीं लगता कि वास्तव में सवाल पूछा गया है cfarm54 पूछ रहा था। –

+4

सवाल यह था: क्या कई वर्गों का उत्तराधिकारी करने का कोई तरीका है? हालांकि मैंने समाधान नहीं दिया, मैंने सवाल का जवाब सही ढंग से दिया। –

7

आप सी # में एकाधिक विरासत नहीं कर सकते हैं।

यदि आप स्थिर तरीकों को साझा करना चाहते हैं तो यह इंटरफेस का उपयोग करके आप एक ही सिरों को प्राप्त कर सकते हैं।

+2

(-1) "आप इंटरफेस का उपयोग कर एक ही सिरों को प्राप्त कर सकते हैं।" असत्य। उपयोगकर्ता ने स्पष्ट रूप से कहा कि वह 'अलग-अलग स्थैतिक तरीकों को साझा करना' चाहते हैं। इंटरफेस एक ही अंत प्राप्त नहीं करते हैं। मैं एकाधिक विरासत का समर्थन नहीं कर रहा हूं, मैं बस इतना कह रहा हूं कि आपका कथन गलत है। – DevinB

+0

@devinb - उत्तर अपडेट किया गया। – ChrisF

+0

डाउनवोट हटा दिया गया। – DevinB

3

आप "श्रृंखला" में जितनी चाहें उतनी कक्षाएं प्राप्त कर सकते हैं लेकिन .NET भाषाओं पर एकाधिक विरासत की अनुमति नहीं है।

.NET में एकाधिक विरासत के लिए आपका एकमात्र विकल्प इंटरफेस हैं।

9

मान लीजिए कि आप Utils.cs करते हैं:

internal class Utils { 
    public static void Log(string str) { 
     // log str to a file... 
    } 
} 

और वहाँ एक DB.cs लॉग विधि का उपयोग करता है और Utils वर्ग के साथ एक ही नाम स्थान में:

public class DB { 
    public void SaveToDB() { 
     // some db operations 
     Utils.Log("DB operation successful"); 
    } 
} 

के बाद से लॉग विधि है स्थैतिक, आपको इस विधि का उपयोग करने के लिए उपयोग कक्षा शुरू करने की आवश्यकता नहीं है।

एक निष्कर्ष के रूप में, आप एकाधिक विरासत का उपयोग नहीं कर सकते हैं लेकिन आपके मामले में, आपको इसकी भी आवश्यकता नहीं है। आप एकाधिक विरासत के बिना स्थिर तरीकों का उपयोग कर सकते हैं।

+0

धन्यवाद यह वह उत्तर है जिसे मैं @jordan – locoboy

+0

के साथ जोड़ा गया था आपका स्वागत है ... – Zafer

2

.NET में आप केवल एक बेस क्लास से उत्तराधिकारी हो सकते हैं लेकिन कई इंटरफेस लागू कर सकते हैं।

एक ASP.NET विशिष्ट स्थिति है जैसे आप में आप निम्न कर सकते हैं के लिए:

public class BasePage : Page 
{ 
    public string SomeMethod() { //Magic happens here } 
} 

और अपने webforms codebehind में BasePage से विरासत है।

एक और अक्सर पाठ्यक्रम का पालन करना एक कस्टम स्थैतिक वर्ग बनाना है जिसमें सभी स्थैतिक विधियां हैं। सुनिश्चित करें कि आप ASP.NET विशिष्ट चीज़ों के साथ HttpContext.Current के साथ उपसर्ग करने के लिए काम कर रहे हैं।

उदाहरण के लिए

:

public static class HelperClass 
{ 
    public static string GetUsernameFromSession() 
    { 
     return HttpContext.Current.Session["Username"].ToString(); 
    } 
} 
3

जब तक accessors यथोचित रूप से सेट, स्थिर तरीकों और अधिक या कम साझा कर रहे हैं वैसे भी (वास्तव में, वे कीवर्ड VB में साझा का उपयोग करें); इससे कोई फर्क नहीं पड़ता कि वे किस वर्ग में हैं क्योंकि वे किसी भी तत्काल वस्तु से डिस्कनेक्ट हैं।

एक स्थिर विधि कॉल करने के लिए आपको क्लास का नाम है जिस पर वह घोषित किया जाता है के साथ यह प्रस्तावना:

MyClass.MyUtilityMethod(); 

एक्सेसर public होना चाहिए या यह internal हो सकता है अगर फोन करने वाले और विधि में हैं एक ही परियोजना/असेंबली।

अपने लक्ष्य केवल है स्थिर तरीकों के लिए पहुँच का एक बिंदु बनाने के लिए, आप एक वर्ग है कि कॉल के रूप में उपयुक्त अग्रेषित करता है बनाने के लिए:

public static class SharedMethods 
{ 
    public static void SharedMethod1() 
    { 
     ClassA.SharedMethod1(); 
    } 

    public static string GetName() 
    { 
     return NameProvider.GetName(); 
    } 

    public static int GetCount() 
    { 
     return CountClass.GetCount(); 
    } 
} 

इस तरह आप SharedMethods.GetName() आदि

के माध्यम से सब कुछ का उपयोग कर सकते
+0

इस तकनीक को प्रतिनिधिमंडल कहा जाता है। जैसा कि जय सही ढंग से कहता है, यह आपको यहां बहुत अधिक खरीद नहीं करता है। –

2

आप कई कक्षाओं से प्राप्त नहीं कर सकते हैं। हालांकि, आप एक दूसरे के उत्तराधिकारी वर्गों को एक साथ जोड़ सकते हैं।

क्लास कर्मचारी

कक्षा प्रबंधक: कर्मचारी

वर्ग RegionalDirector: प्रबंधक

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

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