2010-06-30 13 views
5

से गैर-स्थैतिक जानकारी प्राप्त करने का एक तरीका मुझे पता है कि आप उदाहरण सदस्यों से स्थिर सदस्य नहीं हो सकते हैं।स्टेटिक संदर्भ

लेकिन देता है कहते हैं कि मैं एक विधानसभा में इस:

public class ClassA 
{ 
    public List<order> GetOrders(int orderID) 
    { 
     ... 
    } 
} 

फिर एक और विधानसभा में इस:

public static ClassB 
{ 
    private static void DoSomethingElse(int orderID) 
    { 
     List<order> orderList = ClassA.GetOrders(orderID); 
     ...rest of code 
    } 
} 

वहाँ किसी भी तरह से अभी भी क्लास ए में है कि विधि किसी अन्य तरीके से प्राप्त करने के लिए है ... कुछ इस के आसपास काम करते हैं?

+1

'GetOrders (..)' को कॉल करने के लिए आपको 'कक्षा' के उदाहरण की आवश्यकता होगी क्योंकि यह 'स्थिर 'चिह्नित नहीं है। क्या आपका मतलब यह 'स्थिर' होना चाहिए? –

+0

क्लास ए सिंगलटन – PositiveGuy

+0

मुझे लगता है कि मैं सिंगलटन को अन्य विधानसभा में संभवतः क्लासबी – PositiveGuy

उत्तर

12

आप निश्चित रूप से उदाहरण के सदस्यों से पहुँच स्थिर सदस्यों ... लेकिन आप को समझना चाहिए कर सकते हैं क्यों आप एक उदाहरण के बिना उदाहरण के सदस्यों तक नहीं पहुँच सकता।

आपकी कक्षा मूल रूप से कहती है कि ClassA का प्रत्येक उदाहरण आपको किसी विशेष आईडी से जुड़े आदेशों की एक सूची प्राप्त करने की अनुमति देता है। अब, ClassA के विभिन्न उदाहरण अलग-अलग परिणाम दे सकते हैं - उदाहरण के लिए, वे अलग-अलग डेटाबेस से कनेक्ट हो सकते हैं। DoSomethingElse में आप कौन से परिणाम प्राप्त करना चाहते हैं?

एक सरल उदाहरण के लिए, मान लीजिए कि हम एक Person वर्ग था, और प्रत्येक व्यक्ति को एक नाम था: "Person.Name क्या है"

public class Person 
{ 
    public string Name { get; set; } 
} 

यह मतलब है यह पूछना नहीं - क्योंकि आपने यह निर्दिष्ट नहीं किया है कि आप किस व्यक्ति के बारे में बात कर रहे हैं।

आप या तो ClassA.GetOrders स्थिर करना चाहिए - अगर यह आभासी सदस्यों सहित किसी भी प्रति-उदाहरण जानकारी, शामिल नहीं करता है - या ClassBClassA का उदाहरण है जब बाहर आदेश पाने के उपयोग करने के लिए के बारे में पता कर सकते हैं।

आप हमें इन कक्षाओं के लिए और अधिक यथार्थवादी नाम बताएँ सकता है, तो हम मार्गदर्शन दे सकता है के रूप में जो का हल और अधिक उपयुक्त होने की संभावना है ... व्यक्तिगत रूप से मैं आम तौर पर पक्ष बाद दृष्टिकोण, के रूप में स्थिर सदस्यों आम तौर पर नेतृत्व करेंगे कम परीक्षण योग्य कोड के लिए।

+0

मैं स्थैतिक सदस्यों के माध्यम से गैर स्थैतिक सदस्यों तक पहुंचने के बारे में बात कर रहा हूं ... दूसरी तरफ जो संभव नहीं है। – PositiveGuy

+0

@coffeeaddict: "गैर स्थैतिक" = "उदाहरण"। मेरी पहली वाक्य * आपकी * पहली वाक्य का जवाब है: "मुझे पता है कि आप आवृत्ति सदस्यों से और इसके विपरीत स्थिर सदस्यों तक नहीं पहुंच सकते हैं।" यह सिर्फ गलत है। –

+0

हाँ मैं ये सब समझता हूं। मुझे लगता है कि मैंने सोचा कि क्या इस मुद्दे को हल करने के लिए कुछ विकल्प था। मैं कक्षा को स्थिर या इसके विपरीत होने के लिए नहीं बदलना चाहता हूं..मेरे पास एक बड़ा रिफैक्टरिंग मुद्दा होगा। – PositiveGuy

4

सुनिश्चित नहीं हैं कि मैं तुम्हें अधिकार मिल गया है, लेकिन कोशिश new ClassA().GetOrder(orderID);

+0

क्लासए एक सिंगलटन है ... – PositiveGuy

1

मुझे पता है कि आप आवृत्ति सदस्यों और इसके विपरीत से स्थिर सदस्यों तक नहीं पहुंच सकते हैं।

वास्तव में आप कर सकते हैं।

public class MyClass 
{ 
    public static void Foo() 
    { 
     Console.Write("Foo"); 
    } 

    public void Bar() 
    { 
     Foo(); // Perfectly valid call 
    } 
} 

लेकिन अन्य तरीके से (स्थिर से उदाहरण) आप वास्तव में एक उदाहरण बनाने की जरूरत जाना:

public class MyClass 
{ 
    public static void Foo() 
    { 
     MyClass c = new MyClass(); 
     c.Bar(); 
    } 

    public void Bar() 
    { 
     Console.Write("Foo"); 
    } 
} 

आप भ्रमित static हो सकता है के साथ यह विभिन्न भाषाओं में अर्थ है।सी # में इसका मतलब है कि सदस्य वर्ग के किसी भी विशिष्ट उदाहरण के लिए बाध्य नहीं है, आप के प्रभाव में इस तरह उपरोक्त उदाहरण से स्थिर सदस्य कह सकते हैं:

MyClass.Foo(); 
0

आप सिंगलटन उदाहरण और आप के लिए उपयोग की जरूरत है एक स्थिर सिंगलटन एक्सेसर (जैसे .Instance या .GetInstance()) नहीं है, तो आप विधि को कॉल करने से पहले कुछ तरीकों से कक्षा बी में उदाहरण इंजेक्ट कर सकते हैं (यह उदाहरण सार्वजनिक स्थैतिक क्षेत्र का उपयोग करता है, लेकिन आप अभ्यास में कुछ सुरक्षित चाहते हैं) :

public static class ClassB 
{ 
    //The single instance has to be injected before DoSomethingElse can be used 
    public static ClassA ClassA; 

    private static void DoSomethingElse(int orderID) 
    { 
     List<Order> orderList = ClassA.GetOrders(orderID); 
     //...rest of code 
    } 
} 

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

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