2012-03-01 13 views
7

मान लीजिए मेरे पास इंटरफ़ेस नामक एक इंटरफ़ेस है, और बेस नामक एक ठोस वर्ग है, जो चीज़ को थोड़ा अधिक जटिल बनाने के लिए, एक सीटीआर है जिसके लिए कुछ तर्क की आवश्यकता होती है।बेनामी एक वर्ग को विस्तारित करना और एक ही समय में एक इंटरफ़ेस को कार्यान्वित करना?

मैं एक अज्ञात वर्ग बनाना चाहता हूं जो आधार को बढ़ाएगा और इंटरफेस लागू करेगा।

कुछ

Interface get() 
{ 
    return new Base (1, "one") implements Interace() {}; 
} 

जो मुझे करने के लिए उचित है, लेकिन यह काम नहीं करता की तरह!

(पी.एस: असल में, इंटरफेस और बेस भी सामान्य वर्ग हैं:। डी लेकिन मैं अब के लिए है कि ध्यान नहीं देंगे)

+0

जेनेरिक सामान बुरे सपने बन सकता है अगर वहाँ भी है बहुत अमूर्त इसे सरल रखें;) –

उत्तर

1

यह परिदृश्य मुझे थोड़ा समझ में आता है। यहाँ क्यों है: वर्ग मान Base यह है:

class MyClass extends Base implements Interface { 
} 

इस:

interface Interface { 
    public void bar(); 
} 

अब आप एक अनाम वर्ग है कि इस तरह किया जाएगा बनाना चाहते हैं:

class Base { 
    public void foo(); 
} 

और Interface यह है इसका अर्थ यह होगा कि MyClassBase से bar को विरासत (या संभवतः ओवरराइड) विधि प्राप्त करता है और एम को लागू करना होगा fooInterface से। अब तक बहुत अच्छा है, आपकी कक्षा में इन दो तरीकों से कोई रास्ता है।

अब, सोचें कि जब आप अपनी विधि से Interface प्रकार की ऑब्जेक्ट लौट रहे हैं तो क्या होता है: आपको केवल Interface ऑफ़र की कार्यक्षमता मिलती है, अर्थात् विधि foobar खो गया है (पहुंच योग्य नहीं)। यह हमें नीचे लाता है दो मामलों के लिए:

  1. विस्तार Base, बेकार है क्योंकि आप अपने तरीकों का उपयोग करने के लिए नहीं मिलता है के बाद से नई वस्तु एक Interface के रूप में देखा जाता है।
  2. Interface भी एक विधि foo है, लेकिन इसका मतलब यह होता है कि Base ही Interface को लागू करना चाहिए, ताकि आप केवल Base सीधे विस्तार कर सकते हैं:
class Base implements Interface { 
    public void foo(); 
    public void bar(); 
} 

class MyClass extends Base { 
} 
+0

ठीक है, मुझे लगता है कि "उपकरण इंटरफ़ेस" का इरादा केवल कलाकारों का प्रदर्शन करने के लिए था। मैं ठोस उदाहरणों का उपयोग करूंगा। मेरे पास एक व्यूक्लास है जो संग्रह वर्ग को बढ़ाता है। फिर मैं कुंजी-सेट और मूल्य-सेट को लागू करने के लिए इस व्यूक्लास का उपयोग करता हूं। मान लीजिए कि मुझे किसी भी तरह से ViewClass में होने वाले सभी कार्यान्वयन मिल गए हैं, जिसका अर्थ है कि, तकनीकी रूप से मुझे कुंजी सेट या मान सेट के लिए कोई अतिरिक्त कोड डालने की आवश्यकता नहीं है। देखभाल करने के लिए केवल एक चीज छोड़ दी गई है। स्पष्ट रूप से keySet() को एक सेट वापस करना होगा, जबकि मान() को संग्रह को वापस करना होगा। तो, इसे एक और तरीका रखने के लिए, क्या मैं बस कर सकता हूं [वापसी (सेट ) नया बेस (...)]? – user113454

+0

'MyClass' अनाम किस तरह से है? इसका नाम है! –

+0

@ जोन स्कीट, ठीक है, मैंने एक नाम इस्तेमाल किया ताकि मैं इसे स्पष्टीकरण में देख सकूं। – Tudor

11

नहीं, आप उस के साथ एक अनाम वर्ग नहीं कर सकते। यदि आप वास्तव में हालांकि चाहते हैं तो आप के लिए एक विधि के भीतर एक नामित वर्ग बना सकते हैं:

class Base { 
} 

interface Interface { 
} 

public class Test { 
    public static void main(String[] args) { 
     class Foo extends Base implements Interface { 
     }; 

     Foo x = new Foo(); 
    } 
} 

व्यक्तिगत तौर पर मैं आम तौर पर इस बाहर एक स्थिर नेस्टेड वर्ग अपने आप में खींच चाहते हैं, लेकिन यह तुम्हारी पसंद है ...

+0

मुझे नहीं पता था कि हमारे पास एक विधि के अंदर एक कक्षा हो सकती है !!! – user113454

+0

@ user1064918: इसका शायद ही कभी उपयोग किया जाता है, और अच्छे कारण के लिए - इसे पढ़ना मुश्किल है। –

+0

@ जोन्स स्केट मैंने यह सेट अप किया है, मुझे किसी विधि के अंदर नामित कक्षाओं का उपयोग करने के बजाय करने का एक और तरीका पता नहीं है। वे केवल टाइप-कास्ट अपेक्षित प्रकार को संतुष्ट करने के लिए उपयोग किए जाते हैं। https: //gist.github।कॉम/आसन्न/5248440 यदि आप किसी अन्य तरीके से जानते हैं, तो मुझे उत्सुकता है, या लगता है कि यह एक विधि के साथ नामित कक्षाओं का एक अच्छा वैध उपयोग है। –

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