2010-12-11 15 views
7

जैसा कि शीर्षक से पता चलता है कि मैं समझना चाहता हूं कि स्थिर वर्गों में केवल स्थिर सदस्य क्यों हो सकते हैं। मुझे उम्मीद है कि यह सभी प्रोग्रामिंग भाषाओं में समान है। तो मुझे विश्वास है कि सभी भाषाओं के लिए स्पष्टीकरण समान होगा।स्थिर वर्गों में केवल स्थिर सदस्य क्यों हो सकते हैं?

+3

थोड़ा होमवर्ककी लगता है ... क्या आपने इसे सोचा है? स्थैतिक वर्ग में गैर स्थैतिक सदस्यों को अनुमति देने का क्या उद्देश्य होगा? – mpen

+0

मुझे नियम है कि 'स्थिर वर्ग में गैर स्थैतिक सदस्य नहीं हो सकते हैं' नियम। लेकिन मैं समझना चाहता था क्यों। असल में मुझे स्मृति के संदर्भ में अधिक geeky उत्तरों की उम्मीद है कि कैसे स्थिर कक्षाओं और उनके सदस्यों को संग्रहीत किया जाता है और कैसे गैर स्थैतिक वर्ग और सदस्यों को संग्रहीत किया जाता है। :) – NLV

उत्तर

14

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

इसलिए स्थिर कक्षाओं केवल स्थिर सदस्यों

2

मुमकिन है क्योंकि उदाहरण के तरीकों कहा जाता है कभी नहीं किया जा सकता है हो सकता है।

1

यदि आप एक स्थैतिक वर्ग में एक गैर स्थैतिक सदस्य डालते हैं, तो यह एक स्थिर वर्ग नहीं होगा। (आप स्थैतिक वर्ग को तत्काल नहीं कर सकते - गैर स्थैतिक सदस्यों के लिए, आपको कक्षा के उदाहरण बनाने में सक्षम होना चाहिए, जिन पर इसे नियमित वर्ग बनाना होगा)

इसे देखने के लिए एक और तरीका, एक वर्ग को स्थैतिक के रूप में चिह्नित करके, आप जानबूझकर संकलक के लिए पूछ रहे हैं कि आप उस वर्ग में गैर स्थैतिक तरीकों को न रखने दें - यह एक डिज़ाइन निर्णय है जिसे आपने बनाया है, और संकलक यह जांचने में सहायता करता है कि आप अपना अनुसरण करते हैं डिज़ाइन।

4

एक स्थिर वर्ग को तत्काल नहीं किया जा सकता है। इसलिए, गैर स्थैतिक सदस्यों को कभी भी एक्सेस नहीं किया जा सका।

यदि आप स्थिर सदस्यों को मिश्रण और मिलान करना चाहते हैं, तो कक्षा को स्थिर न बनाएं।

7

यह एक डिज़ाइन निर्णय नहीं है, जितना तार्किक है। शुरू करने का सबसे आसान स्थान अवधारणाओं की प्रासंगिक परिभाषाओं को देखकर है:

एक स्थैतिक वर्ग वह है जिसे तत्काल नहीं किया जा सकता है। इसका मतलब है कि आप उस वर्ग के प्रकार की वस्तुओं को नहीं बना सकते हैं।

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

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

हालांकि, आप में स्थैतिक सदस्यों वाले गैर-स्थैतिक वर्ग हैं। इस तरह, आप डेटा तक पहुंच सकते हैं या उस वर्ग की ऑब्जेक्ट को तत्काल किए बिना स्थिर सदस्यों के रूप में प्रकट विधियों को कॉल कर सकते हैं। हालांकि, आप भी उस वर्ग के प्रकार की वस्तु को तुरंत चालू कर सकते हैं और गैर स्थैतिक (या उदाहरण) सदस्यों तक पहुंच सकते हैं। उदाहरण के लिए, यदि आपके पास कक्षा Circle थी, तो आपके पास CalculateArea फ़ंक्शन और PI फ़ील्ड जैसे स्थिर सदस्य हो सकते हैं। ये सदस्य सभी मंडलियों पर लागू होते हैं, आम तौर पर, इस तथ्य के आधार पर कि वे मंडल हैं। लेकिन आपके पास गैर-स्थैतिक सदस्य भी हो सकते हैं जो उस वर्ग के विशिष्ट उदाहरण से जुड़े हुए हैं, क्योंकि वे विशिष्ट सर्कल ऑब्जेक्ट्स का वर्णन करते हैं। ये फ़ील्ड Diameter और Circumference हो सकते हैं।आपके पास गैर-स्थैतिक फ़ंक्शंस भी हो सकते हैं जो उस विशेष उदाहरण के लिए गैर स्थैतिक फ़ील्ड में संग्रहीत डेटा को देखते हुए सर्कल के क्षेत्र की गणना करते हैं।

-1

मुझे यकीन नहीं है कि यह संबंधित है लेकिन (कम से कम # .net 4.0 में) एक स्थिर वर्ग में गैर स्थैतिक वर्ग परिभाषाएं हो सकती हैं जिनमें गैर स्थैतिक सदस्य होते हैं। तो ऐसा लगता है कि आप स्थैतिक वर्ग में गैर स्थैतिक सदस्यों को जोड़ सकते हैं क्योंकि एक नेस्टेड प्रकार को member माना जाता है।

उदाहरण:

public static class MyClass 
{ 
    /// <summary> 
    /// This non-static class is accessible and able to be instantiated through the 
    /// static class MyClass. 
    /// </summary> 
    public class Type1 
    { 
     public String prop1 { get; set; } 
     public String funct1(String result) 
     { 
      return result; 
     } 
    } 

    /// <summary> 
    /// This function is inaccessible since it requires an instance of MyClass. 
    /// It will also cause a compile error. 
    /// </summary> 
    /// <returns></returns> 
    public String nonStaticFunc() 
    { 
     return "aString"; 
    } 

    /// <summary> 
    /// This function is accessible through the MyClass type because it is also static 
    /// and therefore does not require a class instance. 
    /// </summary> 
    /// <returns></returns> 
    public static String staticFunc(String str) 
    { 
     return str; 
    } 
} 

आप देख सकते हैं, स्थिर वर्ग MyClass एक गैर स्थैतिक कक्षा परिभाषा टाइप 1 इसी क्रम का उपयोग करने के instanced किया जाना चाहिए है। जबकि MyClass में स्थैतिक फ़ंक्शन staticFunc को किसी उदाहरण की आवश्यकता नहीं है।

//Valid operations 

String result = MyClass.staticFunc("result"); //No class instance. 

MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type. 
someObj.prop1 = someObj.funct1("hi"); 
संबंधित मुद्दे