प्रसंग: .NET 3.5, VS2008। मुझे इस सवाल के शीर्षक के बारे में निश्चित नहीं है, इसलिए शीर्षक के बारे में भी टिप्पणी करने में संकोच न करें :-)मैं एक सामान्य कंटेनर वर्ग है कि सी # में दिए गए इंटरफ़ेस लागू करता है कैसे लिख सकता है?
यहां परिदृश्य है: मेरे पास कई कक्षाएं हैं, फू और बार कहें, उनमें से सभी निम्नलिखित इंटरफेस को लागू करते हैं :
public interface IStartable
{
void Start();
void Stop();
}
और अब मैं एक कंटेनर वर्ग है, जो अपने निर्माता में एक तर्क के रूप एक IEnumerable <IStartable> हो जाता है करने के लिए करना चाहते हैं। इस वर्ग, बारी में, भी IStartable इंटरफ़ेस को लागू करना चाहिए:
public class StartableGroup : IStartable // this is the container class
{
private readonly IEnumerable<IStartable> startables;
public StartableGroup(IEnumerable<IStartable> startables)
{
this.startables = startables;
}
public void Start()
{
foreach (var startable in startables)
{
startable.Start();
}
}
public void Stop()
{
foreach (var startable in startables)
{
startable.Stop();
}
}
}
तो मेरे सवाल है: कैसे मैं इसे मैन्युअल कोड लिखने के बिना कर सकते हैं, और कोड पीढ़ी के बिना? दूसरे शब्दों में, मैं निम्नलिखित की तरह somethig करना चाहते हैं।
var arr = new IStartable[] { new Foo(), new Bar("wow") };
var mygroup = GroupGenerator<IStartable>.Create(arr);
mygroup.Start(); // --> calls Foo's Start and Bar's Start
प्रतिबंध:
- कोई कोड पीढ़ी (जो है, संकलन समय पर कोई वास्तविक शाब्दिक कोड)
- इंटरफेस सिर्फ शून्य विधियों, के साथ या तर्कों के बिना है
प्रेरणा:
- मैं विभिन्न इंटरफेस के प्लगइन्स की एक बहुत कुछ के साथ, एक बहुत बड़ी आवेदन किया है। प्रत्येक इंटरफ़ेस के लिए "समूह कंटेनर" कक्षा को मैन्युअल रूप से लिखना
- मैन्युअल रूप से कोड लिखना त्रुटि प्रवण
- आईटर्टेबल इंटरफ़ेस में कोई भी जोड़ या हस्ताक्षर अपडेट "मैन्युअल) में" समूह कंटेनर "वर्ग
- सीखना
मैं समझता हूँ कि मैं यहाँ प्रतिबिंब का उपयोग करना होगा, लेकिन मैं नहीं बल्कि मेरे लिए तारों करने के लिए एक मजबूत ढांचा (महल के DynamicProxy या RunSharp की तरह) का उपयोग करेंगे।
किसी भी विचार?
तो क्या आप * स्टार्ट करने योग्य समूह वर्ग नहीं चाहते हैं? इसके साथ गलत क्या है? – Noldorin
क्या मैं पूछ सकता हूं: क्यों? समस्या को हल करने की क्या समस्या है? (यह जवाब को प्रभावित कर सकता है ...)। –
@ नोल्डोरिन, @ मर्क ग्रेवेल, प्रेरणा मूल प्रश्न में जोड़ा गया। –