2012-05-09 8 views
6

मुझे वास्तव में एक इंटरफ़ेस में नियमित चर घोषित करने और दो वर्गों में उस इंटरफ़ेस को लागू करने में सक्षम होना है जो मुझे प्रत्येक में इन्हें फिर से घोषित नहीं करना होगा कक्षा (यानी class.variables के बजाय class.data.variables)। क्या कोई तरीका है कि मैं एक ही लक्ष्य को अलग-अलग प्राप्त कर सकता हूं?मेरे पास दो वर्गों में समान वैरिएबल परिभाषाएं कैसे साझा की जा सकती हैं

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

तो, यह बहुत अच्छा होगा अगर मैं एक वर्ग (सेलडाटा रिकार्ड.जावा कहूं) जो अतिरिक्त डेटा घोषणाएं आयोजित कर सकता है और उस वर्ग को दोनों स्थानों (जेएलएबल एक्सटेंशन और एक्सएमएल डेटा) में इस्तेमाल किए बिना इस्तेमाल किया जा सकता है XML.data.CellDataRecordXXX जैसे कुछ।

+0

आप क्या वर्णन कर रहे हैं एक * मिश्रण में * कहा जा सकता है - और जावा में वे नहीं हैं। आपको एक पैटर्न या दूसरे का सहारा लेना होगा, जिसे आप पहले ही परिचित हैं। –

+0

मेरा जैसी ही समस्या है। – Acewin

उत्तर

5

आप विरासत के साथ या इंटरफ़ेस का उपयोग कर ऐसा कर सकते हैं, जहां चर क्लाइंट क्लास में स्थिर के रूप में सेट किया गया है। यदि आप एक JLabel बढ़ा रहे हैं के बाद से, आप दोनों वर्गों पर इंटरफ़ेस को लागू करना चाहिए:

public interface MyInterface { 
    int someint = 9; 
} 

public class MyClass1 extends JLabel implements MyInterface { 
    //this class has access to `someint` 
} 

public class MyClass2 extends JLabel implements MyInterface { 
    // also has access to `someint` 
} 

संपादित

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

अब आपको एक अलग वर्ग की आवश्यकता होगी ताकि मूल्य प्राप्त करने के लिए अन्य कक्षाओं से उदाहरण किए जा सकें। आपको static कीवर्ड का उपयोग यह सुनिश्चित करने के लिए करना है कि एक प्रति सभी वर्ग उदाहरणों के लिए रखा गया हो।

public class MyVariableWrapper { 
    public static volatile int some_var = 9; 
    public void updateSomeVar(int newvar) { 
     some_var = newvar; 
    } 
    public int getSomeVar() { return some_var; } 
} 

अब अन्य दो वर्गों सिर्फ इस कार्य करें:

public class MyClass1 extends JLabel { 
    MyVariableWrapper myVariableWrapper; 
    MyClass1() { 
     super(); 
     myVariableWrapper = new MyVariableWrapper(); 
     // now I have access to `some_var` 
    } 
} 

public class MyClass2 extends JLabel { 
    MyVariableWrapper myVariableWrapper; 
    MyClass2() { 
     super(); 
     myVariableWrapper = new MyVariableWrapper(); 
     // now I have access to the same `some_var` as MyClass1 
    } 

    // this is a wrapper method for your convenience 
    // since you don't like the excess code when accessing the variable 
    public int getSomeVar() { 
     return myVariableWrapper.some_var; 
     // or myVariableWrapper.getSomeVar(); 
    } 
    public void setSomeVar(int newvar) { 
     myVariableWrapper.some_var = newvar; 
     // or myVariableWrapper.setSomeVar(newvar); 
    } 
} 

अब आप यह कर सकते हैं:

MyClass2 myClass2 = new MyClass2(); 
System.out.println(""+myClass2.getSomeVar()); 
+0

मेरी समझ यह है कि यदि मैं एक इंटरफ़ेस का उपयोग करता हूं तो मेरे सभी "चर" "स्थिरांक" बन जाते हैं और मुझे उन्हें चर होने की आवश्यकता होती है। इसलिए, अगर मैं सही ढंग से समझता हूं, तो एक इंटरफ़ेस मेरे लिए काम नहीं करेगा। –

+0

@ जेस्टरहॉक ओह ठीक है, आपको केवल अपनी कक्षा में 'स्थिर' और 'अस्थिर' के रूप में चर घोषित करने की आवश्यकता है, और उसके बाद उस वर्ग के उदाहरणों को दो वर्गों से बनायें जिन्हें चर की आवश्यकता है। जावा में अस्थिर चर का उपयोग करने का एक उदाहरण यहां दिया गया है: http://ilkinbalkanay.blogspot.co.uk/2007/10/volatile-variables-in-java.html – Ozzy

+0

@JesterHawk मेरा अद्यतन उत्तर भी देखें – Ozzy

1

मुझे यकीन नहीं है कि मैं आपकी समस्या को 100% समझता हूं लेकिन आपके वर्णन की पहली कुछ पंक्तियों से, एक इंटरफ़ेस को लागू करने के बजाय, आप एक अमूर्त वर्ग को परिभाषित कर सकते हैं और अपनी कक्षाएं इसे बढ़ा सकते हैं। इस तरह, आप अमूर्त वर्ग में विशेषताओं को परिभाषित करने में सक्षम होंगे और ये सभी उप-वर्गों के लिए आम होंगे।

+1

वह पहले से ही 'जेलाबेल' बढ़ा रहा है, इसलिए कोई नहीं। –

+0

हां, पकड़ यह है कि कोई जेएलएबल बढ़ाता है क्योंकि मुझे जेपीनल पर इसे खींचने की क्षमता की आवश्यकता होती है। और चूंकि मेरे पास कक्षा नहीं हो सकती है, दोनों जेएलएबल और एक सार वर्ग (जो वास्तव में अच्छा और सहायक होगा), जो काम नहीं करता है। –

+0

मैंने कक्षा के घटक के रूप में जेएलएबल रखने का प्रयास किया लेकिन ड्राइंग भाग के साथ मुद्दों में भाग गया।शायद ज्ञान की कमी। लेकिन अनिवार्य रूप से मुझे हटाने के साथ समस्याएं थीं। उदाहरण के लिए, उपयोगकर्ता मॉल को "सेल" को हटाने के लिए क्लिक करता है जिसमें JLabel होता है। मैं इसे फलक से हटाने के लिए प्राप्त कर सकता था लेकिन यह पता लगा रहा था कि यह "सेल" ArrayList में क्या था अस्थिर साबित हुआ। मैं घटक की जांच कर रहा था लेकिन इसे हमेशा नहीं मिला। इसलिए, मुझे जेपीनेल और ऐरेलिस्ट से "सेल" को हटाने के लिए एक विश्वसनीय तरीके से छोड़ा गया था। फिर, शायद ज्ञान की कमी। –

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

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