2016-06-29 12 views
6

मैं तर्क के समूहों है कि इस तरह के रूप में स्थिर कक्षाओं से मिलकर राशि के साथ स्थिर कक्षाओं समूहीकरण (उदाहरण के लिए उत्परिवर्ती)। मैं इस पैटर्न के लिए एक इंटरफ़ेस की तरह कुछ उपयोग करना चाहता हूं, हालांकि स्थिर वर्ग इंटरफेस को कार्यान्वित नहीं कर सकता है, मुझे यकीन नहीं है कि क्या करना है। इस तरह के व्यवहार को साफ तरीके से लागू करने का सबसे अच्छा तरीका क्या है?समान व्यवहार

संपादित करें:

यहाँ मैं वर्तमान में क्या कर रहा हूँ का एक उदाहरण है। कक्षाओं में कोई राज्य नहीं होता है इसलिए मैं उन्हें स्थिर बना देता हूं।

Interface IMutator { 
    int mutate(int i); 
} 

class A : IMutator { 
    int mutate(int i) { /**implementation*/ }; 
} 

class B : IMutator { 
    int mutate(int i) { /**implementation*/ }; 
} 

class C { 
    public List<IMutator> Mutators; 
    public C(List<IMutator> mutators) { 
     Mutators = mutators; 
    } 
} 

//Somewhere else... 
//The new keyword for A and B is what really bothers me in this case. 
var Cinstance = new C(new List<IMutator>() {new A(), new B() /**...*/}); 
+1

गैर स्थिर वर्गों और इंटरफेस आप का उपयोग क्यों नहीं कर सकते हैं बनाया है? क्या कोई कारण है कि आप स्थिर के लिए जा रहे हैं? इन वर्गों का उपयोग क्या है? – dotnetom

+0

इन कक्षाओं में कोई डेटा नहीं है। पूरी तरह से कार्यों के समूह हैं, इसलिए उन्हें अस्थिर बनाने के लिए अजीब लगता है, क्योंकि प्रत्येक उदाहरण समान होगा। हालांकि, यह मेरा वर्तमान दृष्टिकोण है। – shell

+1

क्या आप इन कक्षाओं का नमूना उपयोग प्रदान कर सकते हैं? आपके पास कितने वर्ग होंगे? बस इन 2, दर्जनों, सैकड़ों? एक विकल्प का सुझाव देना मुश्किल है जब संदर्भ स्पष्ट नहीं है – dotnetom

उत्तर

5

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

गैर-स्थैतिक कक्षाएं, केवल तर्क युक्त होना ठीक है। उदा।, लोग स्टेटलेस नियंत्रकों का उपयोग कर एएसपी .NET अनुप्रयोगों का निर्माण करते हैं।

तो, बस static को फेंक दें और एक इंटरफ़ेस निकालें।

+0

कृपया मेरा संपादन देखें। क्या यही आपका मतलब है? धन्यवाद। – shell

+0

@shell: हाँ, यही मेरा मतलब था। आप 'सी' उदाहरणों के अंदर 'IMutator' कार्यान्वयन इंजेक्ट करने के लिए डी कंटेनर का उपयोग कर सकते हैं (यह आपके परेशानियों के बारे में है)। क्या यह प्लगइन-आधारित एप्लिकेशन का कुछ प्रकार है? – Dennis

+0

मैं सी # के लिए नया हूं, मदद के लिए धन्यवाद। मैं डीआई देखेंगे। बहुत सराहना की। – shell

2

अलावा @Dennis जवाब से (जो मैं + 1'ed है, और यह वास्तव में जाने का रास्ता है), अन्य दृष्टिकोण है कि काम कर सकते हैं, कार्य (Func<>) और/या क्रियाओं का सेट (Action<> रहा है) और प्रतिबिंब का उपयोग कर उन्हें हल करें। कोड विशेष रूप से सुरुचिपूर्ण और न ही कलाकार होगा, लेकिन यह काम करता है।

मैं एक त्वरित उदाहरण on dotnetfiddle

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