संभव डुप्लिकेट:
C# - Is there a better alternative than this to ‘switch on type’?सबसे अच्छा तरीका है प्रकार के आधार पर
पर विचार क्लासिक:
class Widget { }
class RedWidget : Widget { }
class BlueWidget : Widget { }
अधिकांश भाग के लिए, मेरे यूआई में, मैं सभी Widget
एस का इलाज कर सकते हैं। हालांकि, मामूली मतभेद हैं, जिन्हें मुझे if
या switch
के माध्यम से करने की आवश्यकता है।
संभावित दृष्टिकोण:
Enum संकेतक - निर्माता द्वारा निर्धारित
enum WidgetVariety { Red, Blue }
class Widget {
public WidgetVariety Variety { get; protected set; }
}
class RedWidget : Widget {
public RedWidget() {
Variety = Red;
}
}
// Likewise for BlueWidget...
switch (mywidget.Variety) {
case WidgetVariety.Red:
// Red specific GUI stuff
case WidgetVariety.Blue:
// Blue specific GUI stuff
}
उपयोग is
Widget w = ...;
if (w is RedWidget) {
(RedWidget)w ...
}
else if (w is BlueWidget) {
(BlueWidget)w ...
}
कारण मैं इस का सहारा लिया गया है 1) के अधिकांश कोड पहले से ही कुछ हद तक लिखा है, लेकिन बहुत उलझन में है। 2) कोड का 9 0% समान है - मूल रूप से ग्रिड व्यू में केवल एक कॉलम को प्रकार के आधार पर अलग-अलग संभाला जाना चाहिए।
आप किसकी सिफारिश करेंगे? (या किसी को भी एक बेहतर समाधान है?)
संपादित मैं जानता हूँ कि मैं शायद आगंतुक पैटर्न की सिफारिश की हो जाएगा, लेकिन यह केवल इस मामले में विरल, मामूली अंतर के लिए जटिल लगता है।
संपादित करें 2 तो एक विशेष अंतर मुझे हार्ड टाइम सॉर्टिंग करना मुश्किल था, यह कॉलम दो प्रकार के बीच अलग है। एक मामले में, यह bool
मान पुनर्प्राप्त करता है, और ग्रिड सेल को असाइन करता है। दूसरे मामले में, यह एक स्ट्रिंग मान मिलता है।
मैं इस मामले में लगता है, यह स्पष्ट है कि मैं निर्धारित कर सकते हैं होना चाहिए:
public object virtual GetColumn4Data();
public override GetColumn4Data() { return m_boolval; }
public override GetColumn4Data() { return m_mystring; }
यह object
के उपयोग के कारण शुरू में मेरे लिए गलत महसूस किया है,। हालांकि, उस संपत्ति का प्रकार है जिसे मैं सेल में असाइन कर रहा हूं, इसलिए बेशक यह समझ में आता है!
कार्यालय आज ऐसा लगता है पर बहुत लंबे ...
ऐसा लगता है कि आप जो कह रहे हैं वह है: चूंकि अधिकांश कोड पहले से ही खराब लिखा गया है, इसलिए आपको अधिक बदसूरत हार्ड-टू-कोड कोड लिखकर प्रवृत्ति को जारी रखने की आवश्यकता है। –
यदि आपके उप-वर्गों में एक प्रकार है जो उनके बीच भिन्न होता है, तो शायद बेस क्लास सामान्य होना चाहिए। फिर यह 'सार्वजनिक वर्चुअल टी GetColumn4Data() बन जाता है; ... सार्वजनिक ओवरराइड बूल GetColumn4Data() {वापसी m_boolval; } ... सार्वजनिक ओवरराइड स्ट्रिंग GetColumn4Data() {वापसी m_mystring; } ' –
@Sahuagin - कृपया उत्तर के लिए बड़े कोड स्निपेट सहेजें। टिप्पणियाँ उन्हें न्याय नहीं करते हैं। –