[c#] आप कन्स्ट्रक्टर हस्ताक्षर और स्थैतिक तरीकों को कैसे लागू करते हैं?



3 Answers

जेनेरिक का उपयोग कर आप पैरामीटर रहित निर्माता के लिए एक प्रकार तर्क को मजबूर कर सकते हैं - लेकिन यह इसकी सीमा के बारे में है

जेनरिक के अलावा, ये वास्तव में इन प्रतिबंधों का उपयोग करने के लिए मुश्किल होगा, भले ही वे मौजूद हों, लेकिन यह कभी-कभी टाइप पैरामीटर / तर्क के लिए उपयोगी हो सकता है इंटरफेस (या संभवतः स्थैतिक इंटरफेस) में स्थैतिक सदस्यों को अनुमति देने से "जेनेरिक संख्यात्मक ऑपरेटर" समस्या के साथ भी मदद मिल सकती है।

मैंने इस बारे में कुछ समय पहले लिखा था जब एक ऐसी ही समस्या का सामना करना पड़ रहा था।

Question

क्या एक (बच्चे) कक्षा को कंसट्रक्टरों को सी # या जावा में विशेष रूप से हस्ताक्षर या विशेष स्थैतिक विधियों के साथ मजबूर करने का कोई तरीका है?

आप स्पष्ट रूप से इसके लिए इंटरफेस का उपयोग नहीं कर सकते, और मुझे पता है कि इसका एक सीमित उपयोग होगा। एक उदाहरण जिसमें मैं कर रहा हूं, यह उपयोगी है जब आप कुछ डिज़ाइन दिशानिर्देश लागू करना चाहते हैं, उदाहरण के लिए:

अपवाद
उन सभी को चार विहित निर्माणकों के पास होना चाहिए, लेकिन इसे लागू करने का कोई तरीका नहीं है। इन्हें पकड़ने के लिए आपको फक्सकोप (सी # केस) जैसे टूल पर भरोसा करना होगा।

ऑपरेटर्स
कोई अनुबंध नहीं है जो निर्दिष्ट करता है कि दो वर्गों को समझाया जा सकता है (ऑपरेटर के साथ + सी # में)

क्या इस सीमा के आसपास काम करने के लिए कोई डिजाइन पैटर्न है? सी # या जावा के भविष्य के संस्करणों में इस सीमा को दूर करने के लिए भाषा में क्या निर्माण किया जा सकता है?




अच्छा, मुझे आपके प्रश्न के शब्दों से पता है जो आप संकलन-समय पर लागू करने के लिए देख रहे हैं। जब तक किसी और के पास कोई शानदार सुझाव / हैक नहीं होता है जो आपको ऐसा करने की अनुमति देगा, जिस तरह से आप संकलक को बता रहे हैं, तो मैं सुझाव दे सकता हूं कि आप कस्टम MSbuild कार्य को लिख सकते हैं जो यह किया था। पोस्ट एसएचआरपीपी जैसे एओपी फ्रेमवर्क आपको इसके निर्माण कार्य मॉडल पर सूअर का बच्चा समर्थन द्वारा कई बार इसे पूरा करने में मदद कर सकता है।

लेकिन कोड विश्लेषण या रन-टाइम प्रवर्तन में क्या गलत है? शायद यह वरीयता है और मैं उनका सम्मान करता हूं, लेकिन सीए / एफएक्सकॉप के साथ व्यक्तिगत रूप से कोई समस्या नहीं है ... और अगर आप सचमुच अपने वर्ग के डाउनस्ट्रीम कार्यान्वयनकर्ता को कंसट्रक्टर हस्ताक्षर करने के लिए मजबूर करना चाहते हैं, तो आप हमेशा नियमों को जोड़ सकते हैं- प्रतिबिंब का उपयोग करके बेस क्लास कन्स्ट्रक्टर में समय की जांच

रिचर्ड




अगर मैं भाषा डिज़ाइनर हूं तो मैं इसे हल करता हूं।

इंटरैसेस को स्थिर तरीके, ऑपरेटरों और कन्स्ट्रक्टरों को शामिल करने की अनुमति दें।

interface IFoo  
{  
  IFoo(int gottaHaveThis);  
  static Bar();  
}

interface ISummable
{
      operator+(ISummable a, ISummable b);
}

संबंधित new IFoo(someInt) या IFoo.Bar() अनुमति न दें

कंट्रोलर्स को विरासत में लाने की अनुमति दें (बस स्थैतिक तरीकों की तरह)

class Foo: IFoo
{
  Foo(int gottaHaveThis) {};
  static Bar() {};
}

class SonOfFoo: Foo 
{
  // SonOfFoo(int gottaHaveThis): base(gottaHaveThis); is implicitly defined
}

class DaughterOfFoo: Foo
{
  DaughhterOfFoo (int gottaHaveThis) {};
}

प्रोग्रामर को इंटरफेस में डालने की अनुमति दें और यदि जरूरी हो तो रन टाइम पर जांच करें, यदि कलाकार निश्चित रूप से मान्य नहीं है, भले ही क्लास स्पष्ट रूप से निर्दिष्ट न हो।

ISummable PassedFirstGrade = (ISummable) 10; 



फोर्स कन्स्ट्रक्टर

आप नहीं कर सकते सबसे नज़दीकी है कि आप आ सकते हैं डिफ़ॉल्ट कन्स्ट्रक्टर को निजी बनाएं और उसके बाद एक निर्माता प्रदान करें जिसमें पैरामीटर हैं। लेकिन अभी भी कमियां हैं

class Base
{
  private Base() { }
  public Base(int x) {}
}

class Derived : Base
{
  //public Derived() { } won't compile because Base() is private
  public Derived(int x) :base(x) {}
  public Derived() : base (0) {} // still works because you are giving a value to base
}



Related