2012-01-15 18 views
44

फैली वर्ग के dependece कम करने के लिए, मैं निर्माता है कि उदाहरण के लिए कुछ वर्ग प्रदान करता है और इंटरफेस को लागू करता है,जेनेरिक वर्ग कि वर्ग और लागू करता इंटरफ़ेस

public interface SomeInterface{ 
    public void someMethod(); 
} 

public class MyFragment extends Fragment implements SomeInterface{ 
    //implementation 
} 

//here is classs, that I need to create. T must extend Fragment and implements 
//SomeInterface. But, I'm afraid, if I'll use MyFragment directly, it will create a 
//dependence of SomeClass from MyFragment. 

public class SomeClass /*generic?*/ { 
    public SomeClass(T parent); 
} 

क्या यह संभव है करने के लिए (सामान्य वर्ग का प्रयोग करके) पैरामीटर भेजना चाहते हैं?

फ़्यूथर, मेरी टी कक्षा का उपयोग करके, मैं संदर्भ के रूप में T.getActivity() का उपयोग करके विचार बनाना चाहता हूं।

+0

क्या आप अधिक जानकारी प्रदान कर सकते हैं? जावा प्रतिबिंब का उपयोग करके आप 'क्लास' ऑब्जेक्ट को एक विधि में पास कर सकते हैं और इसे 'getInterfaces()' के माध्यम से इसके कार्यान्वित इंटरफेस के लिए निरीक्षण कर सकते हैं, साथ ही एक नया उदाहरण बनाने के लिए 'कन्स्ट्रक्टर' प्राप्त/कॉल कर सकते हैं।लेकिन आपका विशिष्ट उपयोग मामला अस्पष्ट है, इसलिए यह पता लगाना मुश्किल है कि आपकी विशेष समस्या को हल करने के लिए इन वस्तुओं को एक साथ कैसे टुकड़ा जाए। – Devunwired

+0

@Devunwired, मेरे प्रश्न को अपडेट किया गया –

उत्तर

106

टी टुकड़ा का विस्तार करने और लागू करना चाहिए SomeInterface

उस मामले में आप SomeClass निम्नलिखित के रूप में घोषित कर सकता है:

public class SomeClass<T extends Fragment & SomeInterface> 

उस प्रकार T की एक वस्तु की आवश्यकता होगी दोनों का विस्तार करने के Fragment और SomeInterface लागू करें।

आगे, मेरी टी कक्षा का उपयोग करके, मैं संदर्भ के रूप में T.getActivity() का उपयोग करके विचार बनाना चाहता हूं।

मैं Android के साथ अपरिचित हूँ, लेकिन अगर getActivity() एक सार्वजनिक उदाहरण विधि Fragment में घोषित है तो, T का एक उदाहरण पर इसे कहते हैं के बाद से संकलक सभी T रों पता है कि विधि के वारिस चाहिए होगा पूरी तरह से संभव हो जाएगा ।

+0

+1 मुझे इसे मारो। – Devunwired

+0

आप मॉकिटो का उपयोग कैसे करें एम प्रकार क्लास बनाने के लिए टी प्रकार का है? –

+1

@bwicks अच्छा सवाल है। मुझे संदेह है कि आपके टेस्ट क्लास को एक प्रकार घोषित करने की आवश्यकता हो सकती है जैसे 'अमूर्त कक्षा टेस्टफ्रेगमेंट फ्रैगमेंट लागू करता है कुछ इंटरफेस' और फिर उस प्रकार को 'testFragment.class' के साथ मॉक करें। –

6

क्या आप ऐसा कुछ करना चाहते हैं?

class SomeClass {} 

interface SomeInterface{ 
    public void someMethod(); 
} 

class AGenericClass<T> extends SomeClass implements SomeInterface { 
    public void someMethod() {} 
} 

इसकी अनुमति है।

लेकिन आपके प्रश्न के बारे में एंड्रॉइड विशिष्ट क्या है? मुझे लगता है कि मुझे कुछ याद आना चाहिए ताकि आप कुछ और विवरण दे सकें?

अद्यतन नीचे

मैं अभी भी पूरी तरह से यकीन है कि आप क्या करना चाहते हैं नहीं कर रहा हूँ, और मैं यह भी यकीन नहीं आप निर्भरता के बारे में चिंता करने की तुरंत जरूरत है हूँ, लेकिन यह भी कानूनी है, bounded type parameters का उपयोग कर :

interface SomeInterface{ 
    public void someMethod(); 
} 

class Fragment { 
    public void aMethodInFragment() { } 
} 

public class SomeClass <T extends Fragment & SomeInterface> { 
    public SomeClass(T parent) { 
     parent.someMethod(); 
     parent.aMethodInFragment(); 
    } 
} 

प्रकार पैरामीटर <T extends Fragment & SomeInterface> निर्दिष्ट करता है कि TFragment का एक उपवर्ग हो सकता है और SomeInterface लागू करना चाहिए।

+0

मेरा प्रश्न अपडेट किया गया। –

4

यह आसान है अगर मैं समझता हूं कि आप कुछ प्रकार के टी को सही करने के लिए सही हैं जो कि फ्रैगमेंट का विस्तार कर रहा है और कुछ इंटरफेस को कार्यान्वित कर रहा है। तो आपको ऐसा कुछ लिखना है।

abstract class TemplateFragment extends Fragment implements SomeInterface{} 

और फिर अपनी कक्षाओं में

class SomeClass<T extends TemplateFragment> { 
... 
} 

यह चाल करेंगे।

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