दिलचस्प पोस्ट
मैं कैसे तय करता हूं कि सही जुड़ने / बाएं जुड़ने या आंतरिक जुड़ने का उपयोग कब करना है या यह निर्धारित करने के लिए कि किस किनारे पर तालिका है? जावा के लिए आराम ग्राहकों? क्या आर% में%%% का मतलब है? परिभाषित करें: एक हैशसेट क्या है? जीसीडी में समवर्ती बनाम सीरियल कतार Jtable के प्रत्येक पंक्ति में जेबटन जोड़ें जैक्सन: फ़ील्ड सीरियलाइजेशन को रोकने के लिए आर में संयोजन और क्रमचय की गणना कैसे करें? मापदंडों के बिना एसक्यूएल इंजेक्शन से बचना मल्टी-उपयोगकर्ता एएसपी.नेट वेब अनुप्रयोग में स्थिर वैरिएबल का क्षेत्र IOS क्रैश डंप में कस्टम डेटा शामिल करना सेट और लिस्ट में क्या अंतर है? WebBrowser नियंत्रण में प्रदान की जाने वाली HTML (जावास्क्रिप्ट द्वारा संसाधित) कैसे प्राप्त करें? ऐप सेवा पर संगीतकार कैसे स्थापित करें? डीबगिंग जानकारी नहीं मिली है या विज़ुअल स्टूडियो के मेल नहीं खाती

मैं एक सार सी # वर्ग पर एक सार निर्माता क्यों नहीं बना सकता?

मैं एक सार वर्ग बना रहा हूँ मैं चाहता हूं कि मेरे प्रत्येक व्युत्पन्न कक्षाएं कन्स्ट्रक्टर के एक विशिष्ट हस्ताक्षर को लागू करने के लिए मजबूर हों। जैसे, मैंने किया जो मैंने किया होता था मैं उन्हें एक विधि को लागू करने के लिए बाध्य करना चाहता था, मैंने एक सार बना दिया

public abstract class A { abstract A(int a, int b); } 

हालांकि मुझे यह संदेश मिलता है कि अमूर्त संशोधक इस आइटम पर अमान्य है। मेरा लक्ष्य इस तरह से कुछ कोड पर बल देना था

 public class B : A { public B(int a, int b) : base(a, b) { //Some other awesome code. } } 

यह सभी सी # .NET कोड है। क्या कोई मेरी मदद कर सकता है?

अपडेट 1

मैं कुछ चीजें जोड़ना चाहता था मैं इसके साथ समाप्त हुआ था।

 private A() { } protected A(int a, int b) { //Code } 

जो कुछ लोग कह रहे हैं, डिफ़ॉल्ट निजी है, और क्लास को एक कन्स्ट्रक्टर को कार्यान्वित करने की आवश्यकता है। हालांकि यह हस्ताक्षर A (int a, int b) के साथ एक निर्माता को मजबूर नहीं करता है।

 public abstract class A { protected abstract A(int a, int b) { } } 

अपडेट 2

मुझे स्पष्ट होना चाहिए, इसके आस-पास काम करने के लिए मैंने अपना डिफ़ॉल्ट कन्स्ट्रक्टर निजी बना दिया, और मेरे दूसरे निर्माता संरक्षित हैं I मैं वास्तव में अपना कोड काम करने का एक तरीका तलाश नहीं कर रहा हूं मैंने उस का ख्याल रखा मैं यह समझने की कोशिश कर रहा हूं कि सी # आपको ऐसा क्यों नहीं करने देता है।

वेब के समाधान से एकत्रित समाधान "मैं एक सार सी # वर्ग पर एक सार निर्माता क्यों नहीं बना सकता?"

आपके पास एक अमूर्त निर्माता नहीं हो सकता है क्योंकि अमूर्त अर्थ है कि आपको इसे किसी भी गैर-अमूर्त बच्चे वर्ग में ओवरराइड करना होगा और आप किसी निर्माता को ओवरराइड नहीं कर सकते।

यदि आप इसके बारे में सोचते हैं, तो यह समझ में आता है, क्योंकि आप हमेशा बाल वर्ग के कंस्ट्रक्टर को कॉल करते हैं (नए ऑपरेटर के साथ) और कभी भी आधार वर्ग नहीं।

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

उस कंसल्टेंट को क्लास ए में बदलें

 protected A(int a, int b) { // Some initialisation code here } 

तब आपके उपवर्गों को इसका उपयोग करना होगा, क्योंकि कोई भी डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है।

हालांकि, वे अभी भी निर्माता के वास्तविक हस्ताक्षर को बदल सकते हैं। जहाँ तक मुझे पता है, इसके निर्माता के लिए एक विशिष्ट हस्ताक्षर का उपयोग करने के लिए उप-वर्ग को मजबूर करने का कोई तरीका नहीं है। मुझे पूरा यकीन है कि कन्स्ट्रक्टर बिल्कुल सार नहीं हो सकते

आपको इसके लिए क्या ज़रूरत है? हम इसके लिए लगभग एक काम का सुझाव दे सकते हैं।

यद्यपि आप कन्स्ट्रक्टरों को ओवरराइड नहीं कर सकते हैं, और इसलिए किसी अमूर्त निर्माता को परिभाषित नहीं कर सकते हैं, तो आप अपने सार बेस क्लास में एक सार कारखाना विधि रख सकते हैं। सभी व्युत्पन्न कक्षाओं को उस ओवरराइड की आवश्यकता होगी।

 public abstract class A { abstract A MakeAInstance(int a, int b); } public class B : A { // Must implement: override A MakeAInstance(int a, int b) { // Awesome way to create a B instance goes here } } 

एकाधिक कारण:

1) कन्स्ट्रक्टर इन्हें विरासत में नहीं दिया जाता है इसलिए आप उन्हें ओवरराइड नहीं कर सकते।

2) कन्स्ट्रक्टर एक स्थिर सदस्य समारोह है क्योंकि इसे बुलाए जाने के लिए विशिष्ट उदाहरण की जरूरत नहीं है। सार "आभासी" का तात्पर्य है जिसका मतलब है कि कार्यान्वयन कैसे एक विशिष्ट उदाहरण subclassed है, जो "स्थिर" कीवर्ड के अर्थ के विपरीत के आधार पर भिन्न हो सकते हैं।

आप कन्स्ट्रक्टर हस्ताक्षर को लागू नहीं कर सकते, क्योंकि प्रत्येक व्युत्पन्न कक्षा (होनी चाहिए!) अपने स्वयं के निर्माता () को परिभाषित कर सकती है, और वे किसी भी पैरामीटर को पसंद कर सकते हैं

यदि आपको व्युत्पन्न वर्ग के किसी ऑब्जेक्ट के लिए निर्धारित वैरिएबल सेट करने की आवश्यकता है, तो एक सार पद्धति को परिभाषित करें जिसे व्युत्पन्न कक्षाओं द्वारा कार्यान्वित करने की आवश्यकता है। अगर कक्षाएं सार पद्धति को लागू नहीं करती हैं, तो आपको एक कंपाइलर त्रुटि मिल जाएगी।

आशा है कि यह किसी नए नौकरी में मदद करेगा क्योंकि मैं एक सीटीओआर के साथ एक "सामान्य" सार्वजनिक वर्ग बनाना चाहता हूं जो तर्क लेता है और फिर मुझे इसे एक बाल वर्ग बनाने की जरूरत होती है इसलिए मुझे इसके लिए एक खाली सीटीओर की आवश्यकता होती है।

मैं इससे पहले यह नहीं जानता था: यदि आप एक संरक्षित संरक्षक बनाते हैं तो बाल वर्ग इसे देखता है लेकिन बाकी कार्यक्रम इसे देख नहीं पाता (मुझे लगता है कि मेरा भ्रम एएसपी.नेट में है, इसलिए मैं एस्पक्ष पेज से संरक्षित सभी को देखता हूँ जो सीएस …)

सभी उपवर्ग हमेशा अपने कन्स्ट्रक्टर को निर्दिष्ट कर सकते हैं, जब तक कि वे सुपरक्लास के कन्स्ट्रक्टर को कॉल करते हैं – इसलिए किसी विशिष्ट निर्माता के लिए क्लास को मजबूर करने का कोई तरीका नहीं है (कम से कम, वह जावा में काम करता है)। आप एक कारखाना पैटर्न का उपयोग करने के बारे में देख सकते हैं, आप कहीं न कहीं – आप एक अंतरफलक में एक कारखाना विधि को परिभाषित कर सकते हैं – लेकिन आपको एक अलग फ़ैक्टरी वर्ग की आवश्यकता होगी क्योंकि आपका अमूर्त आधार वर्ग वस्तु की वास्तविक श्रेणी को नहीं जानता है बनाया था।

हालाँकि: संभवत: आपको अन्य / बेहतर प्रतिक्रियाओं को इंगित करने के मुद्दे के एक अधिक ठोस उदाहरण जोड़ना क्या आप कुछ सामान्य त्वरण कोड की तलाश में हैं या क्या आप विशिष्ट आधार वर्गों पर विशिष्ट सेटिंग्स का संबंध रखते हैं?

यदि आप अभी प्रारंभिकता के बारे में चिंतित हैं, जिसे अमूर्त वर्ग द्वारा किया जाना है, ऐसा करने के लिए एक विधि बनाएं, और उस पद्धति के उपयोग को दस्तावेज़ करें

यकीन नहीं अगर यह मदद करता है – पर मुझे लगता है कि यह आपकी समस्या का हल होगा:

 public class A { public A(int a, int b) { DoSomething(int a, int b); } virtual public void DoSomething(int a, int b) { } } public class B : A { override public void DoSomething(int a, int b) { //class specific stuff } } 

जिसके परिणामस्वरूप आप किसी भी व्युत्पन्न वर्ग में आवश्यक व्यवहार के साथ कंसट्रक्टर को सही व्यवहार के साथ कॉल कर सकते हैं।