2009-09-19 14 views
6

के लिए स्थिर चर की अलग-अलग प्रतियां हो सकती हैं, मैं कक्षा के प्रकार के आधार पर एक अलग मूल्य के साथ एक ही स्थिर चर होना चाहता हूं।क्या मेरे पास प्रत्येक अलग-अलग प्रकार के विरासत वर्ग

तो मैं

public class Entity 
{ 
    public static Bitmap sprite; 

    public void draw(Canvas canvas, int x, int y) 
    { 
      canvas.drawBitmap(sprite, x, y, null); 
    } 
} 

public class Marine extends Entity 
{ 

} 

public class Genestealer extends Entity 
{ 

} 

और फिर अपने मुख्य कार्यक्रम ही बार में होगा:

Marine.sprite = // Load sprite for all instances of Marine 
Genestealer.sprite = // Load sprite for all instances of Genestealer 

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

क्या यह संभव है?

मैं यह कैसे करूँगा?

+0

और यहां तक ​​कि आपका गुरुत्वाकर्षण अंतरिक्ष समुद्री कवच ​​में एक टक्स पेंगुइन है - भयानक :) – weiji

+0

मुझे लगता है कि आप इसे "नए असमर्थित ऑपरेशन अपवाद" फेंकने के साथ मूल वर्ग में भी परिभाषित कर सकते हैं यदि आपके कुछ बच्चों के वर्ग कभी स्प्राइट नहीं होने की उम्मीद करते थे (हालांकि इसका मतलब यह भी होगा कि आप संकलन समय चेक खो देते हैं)। – rogerdpack

उत्तर

12

एक सार विधि का उपयोग करें:

public class Entity 
{ 
    public abstract Bitmap getSprite(); 

    public void draw(Canvas canvas, int x, int y) 
    { 
      canvas.drawBitmap(getSprite(), x, y, null); 
    } 
} 

public class Marine extends Entity 
{ 
    public Bitmap getSprite() { 
     return /*the sprite*/; 
    } 
} 

स्प्राइट getSprite द्वारा दिया यदि आप चाहें तो एक स्थिर हो सकता है। इस विधि की अच्छी बातें:

  • आप कर सकते हैं नहीं (आसानी से), अपने उपवर्ग में स्प्राइट शामिल करने के लिए भूल जाते हैं के बाद से संकलक अगर आप सार विधि को लागू नहीं करते शिकायत करेंगे।

  • यह लचीला है। मान लीजिए कि "स्तर ऊपर" होने पर एक समुद्री को अलग दिखना चाहिए। स्तर को ध्यान में रखने के लिए बस समुद्री की getSprite विधि को बदलें।

  • यह इस तरह की चीज़ के लिए मानक ओओ-मुहावरे है, इसलिए उनके कोड को देखने वाले लोग अपने सिर खरोंच नहीं छोड़े जाएंगे।

0

तो एक स्प्राइट बनाएं और सभी को आवृत्ति चर दें। वे सिर्फ संदर्भ हैं; पॉइंटर्स से शायद ही अधिक।

-1

एक त्वरित परीक्षण आपको दिखाएगा कि, हाँ, आप सबक्लास में स्थिर चर को ओवरराइड कर सकते हैं।

मैंने इसका परीक्षण करने के लिए एक सरल विरासत संरचना को एक साथ रखा है। स्टेटिकटेस्ट StaticTestSub का सुपर है। वे दोनों स्थिर इन्ट्स TEST1, TEST2, और TEST3 को विभिन्न प्रकार की पहुंच के साथ घोषित करते हैं। उदाहरण को सरल बनाने के लिए, मैंने private संस्करण छोड़ा।

public class StaticTest { 
    public static int TEST1 = 1; 
    protected static int TEST2 = 1; 
    static int TEST3 = 1; 

    public static void main(String[] args) { 
      System.out.println("StaticTest.TEST1: " + StaticTest.TEST1); 
      System.out.println("StaticTest.TEST2: " + StaticTest.TEST2); 
      System.out.println("StaticTest.TEST3: " + StaticTest.TEST3); 
      System.out.println("StaticTestSub.TEST1: " + StaticTestSub.TEST1); 
      System.out.println("StaticTestSub.TEST2: " + StaticTestSub.TEST2); 
      System.out.println("StaticTestSub.TEST3: " + StaticTestSub.TEST3); 
    } 
} 


public class StaticTestSub extends StaticTest { 
    public static int TEST1 = 2; 
    protected static int TEST2 = 2; 
    static int TEST3 = 2; 
} 

आप इसे घर पर आजमा सकते हैं। बाहर डाल दिया था:

StaticTest.TEST1: 1
StaticTest.TEST2: 1
StaticTest.TEST3: 1
StaticTestSub.TEST1: 2
StaticTestSub.TEST2: 2
StaticTestSub।Test3: 2

अपनी विशिष्ट आवश्यकताओं के लिए, तथापि, मैं दृष्टिकोण लारेंस गोंजाल्विस द्वारा उठाए गए अनुशंसा करते

+3

ओवरराइड नहीं है, लेकिन छुपाएं। –

1

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

इसके बजाय, उप-वर्गों में स्प्राइट स्थिर बनाएं, और फिर लॉरेंस द्वारा वर्णित विधि संरचना का उपयोग करें।

+0

यह मूल प्रश्न का उत्तर है, वही जवाब प्राप्त करने के लिए अन्य उत्तरों मिलते हैं। लेकिन जवाब नहीं है, सी # में सुपरक्लास में स्थैतिक चर प्रति subclass परिभाषित करने के लिए कोई भी निर्माण नहीं है। –

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