कक्षा का उपयोग करने वाली प्रत्येक फ़ाइल में कोड की एक पंक्ति जोड़ने के बिना, मैं C # में एक वर्ग का नाम कैसे उर्फ ​​करता हूं?


88

मैं एक वर्ग नाम के लिए एक उपनाम बनाना चाहता हूं। निम्नलिखित सिंटैक्स सही होगा:

public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
   ...
}

public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;

लेकिन यह संकलन नहीं करेगा।


उदाहरण

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

कुछ मौजूदा कोड एक स्थिर वर्ग की उपस्थिति पर निर्भर करते हैं:

public static class ColorScheme
{
   ...
}

यह रंग योजना Outlook 2003 रंग योजना है। आउटलुक 2003 रंग योजना को बरकरार रखते हुए मैं आउटलुक 2007 रंग योजना शुरू करना चाहता हूं:

public static class Outlook2003ColorScheme
{
   ...
}

public static class Outlook2007ColorScheme
{
   ...
}

लेकिन मैं अभी भी इस तथ्य का सामना कर रहा हूं कि कोड एक स्थिर वर्ग की उपस्थिति पर निर्भर करता है ColorScheme। मेरा पहला विचार था ColorSchemeकि मैं एक ऐसी कक्षा बनाऊं जो मुझे Outlook2003या तो विरासत में मिले या Outlook2007:

public static class ColorScheme : Outlook2007ColorScheme
{
}

लेकिन आप एक स्थिर वर्ग से विरासत में नहीं मिल सकते।

मेरा अगला विचार स्टैटिक ColorSchemeक्लास बनाना था , लेकिन गैर-स्टैटिक बनाना Outlook2003ColorSchemeऔर बनाना Outlook2007ColorScheme। तब स्थिर ColorSchemeवर्ग में एक स्थिर चर या तो "सही" रंग योजना को इंगित कर सकता है:

public static class ColorScheme
{
    private static CustomColorScheme = new Outlook2007ColorScheme();
    ...
}

private class CustomColorScheme 
{ 
   ...
}

private class Outlook2008ColorScheme : CustomColorScheme 
{
    ...
}

private class Outlook2003ColorScheme : CustomColorScheme 
{
   ...
}

लेकिन इससे मुझे एक वर्ग की रचना करने की आवश्यकता होगी जो आसानी से पठनीय स्थिर रंगों के अतिरंजित गुणों से बना हो, और फिर मेरी ColorSchemeकक्षा को 30 अलग-अलग संपत्ति प्राप्तकर्ताओं को निहित वस्तु में फेंक देना होगा।

यह सिर्फ बहुत अधिक टाइपिंग है।

तो मेरा अगला विचार कक्षा को उर्फ ​​करना था:

public static ColorScheme = Outlook2007ColorScheme;

लेकिन यह संकलन नहीं है।

मैं एक स्थिर वर्ग को दूसरे नाम में कैसे बदल सकता हूं?


अद्यतन: क्या कोई कृपया उत्तर "आप C # में ऐसा नहीं कर सकते हैं" , इसलिए मैं स्वीकार किए गए उत्तर के रूप में चिह्नित कर सकता हूं। उसी प्रश्न का उत्तर चाहने वाला कोई भी व्यक्ति इस प्रश्न को स्वीकार कर लेगा, स्वीकार किए गए उत्तर और कई वर्कअराउंड जो उपयोगी हो सकते हैं या नहीं हो सकते हैं।

मैं सिर्फ इस सवाल को बंद करना चाहता हूं।


आप क्रिस के उत्तर को स्वीकार कर सकते हैं, भले ही आप इसे लागू नहीं करना चाहते हों
devio

2
इसका जवाब नहीं है, यह एक समाधान है। इसका उत्तर यह है कि आप ऐसा नहीं कर सकते - कम से कम जब तक कोई आसपास नहीं आता है और इसे करने के लिए वास्तविक वाक्यविन्यास पोस्ट करता है।
इयान बॉयड

1
यहां आने वाले किसी भी व्यक्ति के लिए, स्वीकृत उत्तर गलत है, क्योंकि उच्चतम रेटेड टिप्पणी वीएस 2010 और वीएस 2017 सी # परियोजनाओं में ठीक काम करती है, जिस पर मैं काम कर रहा हूं। पूरी तरह से योग्य नाम स्थान का उपयोग वर्ग को निर्दिष्ट करने के लिए किया जाना चाहिए, जब उपनाम स्थापित किया जाता है, लेकिन एक बार यह परिभाषित दायरे में कार्य करता है।
जे-अमेरिकनो

मुझे इयान के उत्तर और उनकी टिप्पणियों को बहुत विस्तार से पढ़ना था, इससे पहले कि मैं समझ पाता कि वह क्या चाह रहा था। वह कक्षा को संदर्भित करने वाली प्रत्येक फ़ाइल के शीर्ष पर जोड़ने के बजाय, एक स्थान पर एक वर्ग उपनाम घोषित करना चाहता है । मैं किसी भी दृढ़ता से टाइप की जाने वाली भाषाओं से अवगत नहीं हूँ जो इसका समर्थन करती हैं। (यदि कोई ऐसी भाषा जानता है, तो मैं इसके बारे में जानना चाहूंगा।) मैंने इसे स्पष्ट करने के लिए शीर्षक संपादित किया है।
टूलमेकरवेट

BTW, किसी के लिए जो कुछ ऐसा ही करने की कोशिश कर रहा है: यदि ये ऐसी कक्षाएं हैं जिन्हें आप परिभाषित कर रहे हैं, तो C # दृष्टिकोण को परिभाषित करना है interface, जिसे आपकी सभी कक्षाएं लागू करती हैं। जैसा कि chills42 के उत्तर में बताया गया है । फिर आप एक "सेवा" या "कारखाने" को परिभाषित कर सकते हैं, जो उस वस्तु को लौटाता है जो उस इंटरफ़ेस को लागू करता है, जो वर्तमान परिस्थितियों (जैसे प्लेटफ़ॉर्म / ओएस) या एक कॉन्फ़िगर फ़ाइल पर निर्भर करता है।
टूलमेकरसइट

जवाबों:


131

आप नहीं कर सकते । अगली सबसे अच्छी चीज जो आप कर सकते हैं, वह usingउन फाइलों में घोषणाएं हैं जो कक्षा का उपयोग करती हैं।

उदाहरण के लिए, आप एक आयात उपनाम (एक अर्ध- typedefविकल्प के रूप में) का उपयोग करके आश्रित कोड को फिर से लिख सकते हैं :

using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;

दुर्भाग्य से यह नाम का उपयोग करने वाले हर दायरे / फ़ाइल में जाने की आवश्यकता है।

इसलिए मुझे नहीं पता कि यह आपके मामले में व्यावहारिक है या नहीं।


9
यदि यह उस फ़ाइल के शीर्ष पर जा सकता है जिसमें मूल वर्ग शामिल था: यह बहुत अच्छा होगा। लेकिन usingसभी टूटे हुए कोड में जोड़ा जाना चाहिए। और यह भी नकारता है कि मूल्य एक ही उपनाम है, जो मुझे मौजूदा ColorSchemeवर्ग के सभी उपयोगकर्ताओं को एक नए वर्ग का उपयोग करने के लिए स्विच करता है या बिना परिवर्तन के। दूसरे शब्दों में: मैं ColorSchemeकक्षा को दूसरी कक्षा में बदलना चाहता हूं ।
इयान बॉयड

क्या इसे प्राप्त करने का एक तरीका है और अन्यों को विरासत के साथ प्रचारित करना है। यानी सभी वर्ग MyClass का विस्तार करने के बजाय ColorScheme का उपयोग करने में सक्षम हो जाएगा। केवल ... MySass स्रोत फ़ाइल में उपयोग बयान जोड़कर ColorScheme?
फ्लोरियन ब्यूरल

खैर, यह मेरे मामले के लिए बहुत व्यावहारिक था। अंत में C # मेरी फ़ाइल पथ आरेखित करना बंद कर देगा।
ElDoRado1239

25

आप इस पंक्ति को जोड़कर अपनी कक्षा के लिए एक उपनाम बना सकते हैं:

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;

वर्तमान संदर्भ में 'ColorScheme' नाम मौजूद नहीं है
Ian Boyd

7
आपको पूरी तरह से जरूरत है ।Qualified.Namespace.Of.ColorScheme
Jamie Pate

मुझे लगा कि C # में केवल उपनाम नामस्थान (कक्षाएं नहीं) हो सकते हैं, जहां VB.Net में आप उपनाम नाम या वर्ग का उपयोग करने में सक्षम हैं Imports। क्या मै गलत हु?
निक

यदि आप अपने usingनाम स्थान के अंदर निर्देश रखते हैं, तो आपको पूरी तरह से योग्य नाम की आवश्यकता नहीं है , उदाहरण के लिए जब आपको अपने स्वयं के वर्ग के उपनाम की आवश्यकता होती है।
Elvedin Hamzagic

12

आप अपनी आवश्यकताओं के आधार पर एक ( फैक्टरी | सिंगलटन ) चाहते हैं। आधार यह बनाना है ताकि क्लाइंट कोड को यह पता न चले कि यह किस रंग योजना को मिल रहा है। यदि रंग योजना चौड़ी होनी चाहिए, तो एक सिंगलटन ठीक होना चाहिए। यदि आप अलग-अलग परिस्थितियों में एक अलग योजना का उपयोग कर सकते हैं, तो फैक्टरी पैटर्न संभवतः जाने का रास्ता है। किसी भी तरह से, जब रंग योजना को बदलना होगा, तो कोड को केवल एक स्थान पर बदलना होगा।

public interface ColorScheme {
    Color TitleBar { get; }
    Color Background{ get; }
    ...
}

public static class ColorSchemeFactory {

    private static ColorScheme scheme = new Outlook2007ColorScheme();

    public static ColorScheme GetColorScheme() { //Add applicable arguments
        return scheme;
    }
}

public class Outlook2003ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.LightBlue; }
   }

    public Color Background {
        get { return Color.Gray; }
    }
}

public class Outlook2007ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.Blue; }
   }

    public Color Background {
        get { return Color.White; }
    }
}

यह एक कारखाने के कम और एक सिंगलटन पैटर्न में एक कमजोर प्रयास की तरह दिखता है। एक कारखाना निर्माण विधि के पैरामीटर की संभावना अधिक होगी; आपके पास कुछ और होगा: सार्वजनिक स्थैतिक ColorScheme GetColorScheme (स्ट्रिंग विवरणक);
उल्लू

यह सच है - मूल विचार यह है कि जब कार्यालय 2012 से बाहर आता है, तो यह सुनिश्चित करना है कि कोड को केवल 1 स्थान पर बदलना होगा।
क्रिस मैराती-जॉर्ज

1
यह निश्चित रूप से काम करता है, लेकिन यह निश्चित रूप से एक साधारण समस्या का उद्यम-वाई समाधान है।
इयान बॉयड 14

11

आप सी # में एक वर्ग के नाम को उपनाम नहीं दे सकते।

ऐसी चीजें हैं जो आप कर सकते हैं जो सी # में एक वर्ग नाम का उपनाम नहीं कर रहे हैं।

लेकिन मूल प्रश्न का उत्तर देने के लिए: आप सी # में एक वर्ग के नाम को उपनाम नहीं दे सकते।


अद्यतन: लोग भ्रमित हैं कि usingकाम क्यों नहीं करता है। उदाहरण:

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

ColorScheme.cs

class ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

और सब कुछ काम करता है। अब मैं एक नया वर्ग बनाना चाहता हूं , और इसके लिए उपनाम ColorScheme (ताकि किसी कोड को संशोधित करने की आवश्यकता न हो ):

ColorScheme.cs

using ColorScheme = Outlook2007ColorScheme;

class Outlook2007ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

ओह, मैं माफी चाहता हूँ। यह कोड संकलित नहीं करता है:

यहाँ छवि विवरण दर्ज करें

मेरा सवाल यह था कि C # में एक क्लास को कैसे उतारा जाए । यह नहीं किया जा सकता है। ऐसी चीजें हैं जो मैं कर सकता हूं जो सी # में एक वर्ग नाम का उपनाम नहीं दे रहे हैं :

  • हर कोई परिवर्तन जो पर निर्भर करता है ColorSchemeके लिए using ColorSchemeके बजाय (कोड परिवर्तन वैकल्पिक हल क्योंकि मैं उर्फ नहीं कर सकते हैं)
  • हर कोई जो ColorSchemeएक कारखाने पैटर्न का उपयोग करने पर निर्भर करता है उन्हें एक बहुरूपी वर्ग या इंटरफ़ेस (कोड परिवर्तन को हल करें क्योंकि मैं अन्य नहीं कर सकता) को बदल दें

लेकिन इन वर्कअराउंड में मौजूदा कोड को तोड़ना शामिल है: विकल्प नहीं।

यदि लोग एक ColorSchemeवर्ग की उपस्थिति पर निर्भर करते हैं , तो मुझे वास्तव में एक ColorSchemeकक्षा को कॉपी / पेस्ट करना होगा ।

दूसरे शब्दों में: मैं सी # में एक वर्ग के नाम को उपनाम नहीं दे सकता।

यह अन्य वस्तु उन्मुख भाषाओं के साथ विरोधाभास है, जहां मैं उपनाम को परिभाषित कर सकता हूं:

ColorScheme = Outlook2007ColorScheme

और मुझे किया जाएगा


22
आप सी # में एक वर्ग का नाम दे सकते हैं। "<alias_name> = <full_qualified_name>" का उपयोग करते हुए;
क्लीमाहु जुएल

8
LIke @clemahieu ने कहा, आप पूरी तरह से एक वर्ग का नाम उर्फ ​​कर सकते हैं, आपको बस पूरी तरह से योग्य नाम का उपयोग करना होगा। इसके अतिरिक्त, यदि आपका जेनेरिक क्लास एलियास करता है, तो आपको जेनेरिक क्लास क्वालिफायर जोड़ना होगा। उदाहरण के लिए: ShortName = MyNamespace.SubNamespace.GenericClass <MyType> का उपयोग करना;
दान मॉर्फिस

11
डाउनवोट - आपने कहा है "आप सी # में एक वर्ग के नाम को उपनाम नहीं दे सकते।" आप ऐसा कर सकते हैं। आप जो नहीं कर सकते हैं वह एक वर्ग है जिस तरह से आप चाहते हैं - जो कि काफी उचित आवश्यकता है, लेकिन आपका कथन गलत है।
टॉम डब्ल्यू

8
जैसा कि कई पोस्टरों में बताया गया है, किसी भी तरह से योग्य नाम का उपयोग करने से अलियासिंग नहीं होता है। आप क्लास को उर्फ कर सकते हैं । बस आपको ऐसा करने के लिए पूरी तरह से योग्य नाम का उपयोग करना होगा। आपको यह असुविधाजनक लग सकता है, लेकिन यह बयान नहीं करता है 'आप किसी वर्ग के नाम को सी # में सत्य नहीं कर सकते।' शायद जिस तरह से सी # में अलियासिंग काम करता है, वह उस चीज से अलग है जिसकी आप अपेक्षा कर रहे थे। यह ठीक है - यदि यह मामला है, तो यह बताएं। लेकिन आप सी # में एक वर्ग के नाम को उर्फ कर सकते हैं क्योंकि विनिर्देश बताता है कि आप ऐसा कर सकते हैं, परिभाषा के अनुसार जो यह प्रदान करता है।
टॉम डब्ल्यू

5
मुझे पसंद है कि कैसे हम प्रोग्रामर लाइनों के बीच अपने बयान देंगे। इयान जो वास्तव में कह रहा है कि सी # गूंगा और टूटा हुआ है क्योंकि यह एक साधारण बुनियादी काम नहीं कर सकता है जो कोई भी करना चाहता है और करने में सक्षम होना चाहिए। वह सही है - विशिष्ट शब्दार्थ आपको खुश करता है या नहीं।
IQpierce 17

10

इसे इस्तेमाल करे:

using ColorScheme=[fully qualified].Outlook2007ColorScheme

वर्तमान संदर्भ में 'ColorScheme' नाम मौजूद नहीं है
Ian Boyd

2
आपको पूरी तरह से जरूरत है ।Qualified.Namespace.Of.ColorScheme
Jamie Pate

6

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

using aliasClass = Fully.Qualified.Namespace.Example;
//Example being the class in the Fully.Qualified.Namespace

public class Test{

  public void Test_Function(){

    aliasClass.DoStuff();
    //aliasClass here representing the Example class thus aliasing
    //aliasClass will be in scope for all code in my Test.cs file
  }

}

टाइप किए गए कोड के लिए माफी लेकिन उम्मीद है कि यह बताता है कि इसे कैसे लागू किया जाना चाहिए ताकि उपयोगकर्ताओं को यह विश्वास न हो कि यह C # में नहीं किया जा सकता है।


अगर आप से पता चला है यह भी स्पष्ट किया जाएगा घोषणा अन्य वर्ग की: namespace Fully.Qualified.Namespace{ public class Example {... public void DoStuff(){... }... } }
टूलमेकरवेट

1
स्पष्ट होने के लिए, यह इयान की मांग से अलग है। इयान की एक स्थिति है जहां वह (या नहीं करना चाहता) स्रोत फ़ाइलों को बदल सकता है जो एक वर्ग को संदर्भित करता है। वह अपने आवेदन या पुस्तकालय में केवल एक ही स्थान पर परिवर्तन करने का एक तरीका चाहता है , जिसके परिणामस्वरूप वांछित नाम के साथ एक वर्ग प्रतीत होता है, कि अन्य सभी कोड का उपयोग कर सकते हैं [कई स्रोतों के लिए "का उपयोग कर" बयान के बिना फ़ाइलें - उदाहरण के लिए कि स्रोत परिवर्तन के लिए उपलब्ध नहीं हो सकता है]।
टूलमेकरसैट

4

जिस तरह से आप इसे करना चाहते हैं, उसका नामकरण C # में काम नहीं करेगा। ऐसा इसलिए है क्योंकि अलियासिंग usingनिर्देश के माध्यम से किया जाता है , जो कि प्रश्न में फ़ाइल / नाम स्थान तक सीमित है। यदि आपके पास पुरानी फ़ाइलों के नाम का उपयोग करने वाली 50 फाइलें हैं, तो इसका मतलब होगा कि अद्यतन करने के लिए 50 स्थान।

उस ने कहा, मुझे लगता है कि आपके कोड को यथासंभव कम से कम करने के लिए एक आसान समाधान है। ColorSchemeकार्यान्वयन के साथ वास्तविक कक्षाओं के लिए अपनी कॉल के लिए कक्षा को एक मुखौटा बनाएं , और usingउस फ़ाइल का ColorSchemeउपयोग करके यह निर्धारित करें कि आप किसका उपयोग करते हैं।

दूसरे शब्दों में, ऐसा करें:

using CurrentColorScheme = Outlook2007ColorScheme;
public static class ColorScheme
{
   public static Color ApplyColorScheme(Color c)
   {
       return CurrentColorScheme.ApplyColorScheme(c);
   }
   public static Something DoSomethingElse(Param a, Param b)
   {
       return CurrentColorScheme.DoSomethingElse(a, b);
   }
}

तो पीछे अपने कोड में, कुछ भी नहीं बदलें:

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

फिर आप ColorSchemeकोड की एक पंक्ति ( using CurrentColorScheme = Outlook2008ColorScheme;) को अपडेट करके मानों को अपडेट कर सकते हैं ।

यहाँ कुछ चिंताएँ:

  • प्रत्येक नई विधि या संपत्ति की परिभाषा को तब दो स्थानों पर, ColorSchemeकक्षा में और कक्षा में जोड़ने की आवश्यकता होगी Outlook2007ColorScheme। यह अतिरिक्त काम है, लेकिन अगर यह सच है विरासत कोड, यह एक लगातार घटना नहीं होनी चाहिए। एक बोनस के रूप में, कोड ColorSchemeइतना सरल है कि कोई भी संभावित बग बहुत स्पष्ट है।
  • स्थिर वर्गों का यह प्रयोग मुझे स्वाभाविक नहीं लगता; मैं शायद अलग तरीके से ऐसा करने के लिए विरासत कोड को फिर से भरने की कोशिश करूंगा, लेकिन मैं यह भी समझता हूं कि आपकी स्थिति इसकी अनुमति नहीं दे सकती है।
  • यदि आपके पास पहले से ही एक ColorSchemeवर्ग है जिसे आप प्रतिस्थापित कर रहे हैं, तो यह दृष्टिकोण और कोई भी समस्या हो सकती है। मैं आपको सलाह दूंगा कि आप उस वर्ग का नाम कुछ इस तरह बदलें ColorSchemeOld, और फिर उसके माध्यम से एक्सेस करें using CurrentColorScheme = ColorSchemeOld;

3

मुझे लगता है कि आप हमेशा आधार वर्ग से कुछ भी नहीं जोड़ा जा सकता है

public class Child : MyReallyReallyLongNamedClass {}

अपडेट करें

लेकिन अगर आपके पास classखुद को फिर से तैयार करने की क्षमता है: namespaceएस की कमी के कारण एक वर्ग का नाम आमतौर पर अनावश्यक रूप से लंबा होता है ।

आप के रूप में मामलों को देखते हैं ApiLoginUser, DataBaseUser, WebPortalLoginUser, आम तौर पर की कमी के संकेत नहीं है namespaceकी वजह से डर है कि नाम Userहो सकता है संघर्ष।

हालाँकि, इस मामले में, आप namespaceउपनाम का उपयोग कर सकते हैं , जैसा कि ऊपर के पदों में बताया गया है

using LoginApi = MyCompany.Api.Login;
using AuthDB = MyCompany.DataBase.Auth;
using ViewModels = MyCompany.BananasPortal.Models;

// ...
AuthDB.User dbUser;
using ( var ctxt = new AuthDB.AuthContext() )
{
    dbUser = ctxt.Users.Find(userId);
}

var apiUser = new LoginApi.Models.User {
        Username = dbUser.EmailAddess,
        Password = "*****"
    };

LoginApi.UserSession apiUserSession = await LoginApi.Login(apiUser);
var vm = new ViewModels.User(apiUserSession.User.Details);
return View(vm);

ध्यान दें कि कैसे classनाम सभी हैं User, लेकिन विभिन्न namespaceएस में। उद्धरण PEP-20: पायथन के ज़ेन :

नाम स्थान एक महान विचार का सम्मान कर रहे हैं - चलो उन में से अधिक करते हैं!

उम्मीद है की यह मदद करेगा


2
हमेशा, जब तक आप नहीं कर सकते: उदाहरण के लिए सील की गई कक्षा
मिकुस

लेकिन यह कई मामलों में काम नहीं करेगा। उदाहरण के लिए सार्वजनिक वर्ग MyList: List {} - यदि आप बाद में MyList xyz = something.ToList () की कोशिश करते हैं; तुम फंस जाओगे।
ऑफनर

@Offler आप (और शायद चाहिए) या तो newइस तरह के तरीकों के लिए कीवर्ड का सहारा लें या यहां तक ​​कि अपने खुद के ExtensionMethods के साथ आ सकते हैं, है ना? किसी भी मामले में यह मेरी मजबूत राय है कि आपको हमेशा कस्टम मॉडल / व्यूमॉडल / पोक्सो के साथ वेनिला कलेक्शन क्लासेस (यानी डिक्शनरी, लिस्ट, आईनुमेरेबल, आईक्यूएबल इत्यादि) का उपयोग करना चाहिए। जैसा कि Mvc बताता है: कॉन्फ़िगरेशन पर कन्वेंशन
मानता है

@percebus सभी मामलों में काम नहीं करता है। मैं पुराने कोड को बदलने की कोशिश करता हूं जिसमें कुछ हिस्सों का उपयोग होता है जो अब नए के लिए समर्थित नहीं हैं। टिकाऊ परिवर्तन कोड दूसरों द्वारा बदल दिया जाएगा और अभी भी चलने योग्य होना चाहिए - इसलिए दोनों को अभी उपयोग करने योग्य होना चाहिए। 700.000 LOC (टिप्पणियों के बिना) पर चीजों को परिवर्तित करना और फिर भी इसे चलने देना आसान होगा, अगर c ++ शैली का उपनाम संभव होगा - और आपको दोनों में से कार्यान्वयन के साथ एक उपनाम वर्ग को बदलने के लिए फ़ाइल में केवल एक स्थान की आवश्यकता होगी।
18

फिर से पोस्ट के लिए संपादित करें @Offler के लिए क्या आप ध्वनि का वर्णन कर रहे हैं कि आप इंटरफेस के साथ एक फैक्टरी की तरह somehing जरूरत है। IColorScheme oColorScheme = ColorSchemeFactory.Create(); इसके अलावा, आप में देखना चाहते हो सकता है निर्भरता इंजेक्शन
percebus

2

क्या इंटरफ़ेस का उपयोग करके बदलना संभव है?

शायद आप एक IColorSchemeइंटरफ़ेस बना सकते हैं जिसे सभी वर्ग लागू करते हैं?

यह फैक्ट्री पैटर्न के साथ अच्छी तरह से काम करेगा जैसा कि क्रिस मारस्ति-जॉर्ज द्वारा दिखाया गया है


यह हो सकता है, लेकिन मैं उस वर्ग का नाम बदलने के बजाय उस पर अब और समय बिताने वाला नहीं हूं जो उपयोग करने के लिए "वर्तमान" रंग योजना है।
इयान बॉयड 14

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.