2013-03-29 7 views
5

मैं है जावा में निम्न पदानुक्रम:अवहेलना विधि

interface ObserverB extends ObserverA{} 

interface B extends A { 
    void method2(); 
    addObserver(ObserverB o); 
} 

इस तरह से कि addObserver() में:

interface ObserverA {} 

interface A { 
    void method1(); 
    addObserver(Observer o); 
} 

और मैं इसे इस तरह का विस्तार करना चाहते B की विधि A में उसी विधि को ओवरराइड कर देगी। चूंकि यह काम नहीं करता है, B के कार्यान्वयन को addObserver() के दोनों संस्करणों को लागू करने की आवश्यकता होगी, मेरे पास केवल एक नहीं होना चाहिए।

यह एक चतुर तरीके से किया जा सकता है कि parameterize करने के लिए A की तरह होने को शामिल नहीं करता:

interface A<O extends Observer> { 
    addObserver(O o); 
} 

hackish समाधान बहुत स्वागत है!

+0

जेनेरिक प्रकार हमेशा ऐसी चीज करने के लिए एक बेहतर तरीका है जहां आप – Biswajit

उत्तर

1

कैसे के बारे में -

interface ObserverA {} 

interface A { 

    <T extends ObserverA> void addObserver(T o); 
} 

और -

interface ObserverB extends ObserverA{} 

interface B extends A{ 

    // do nothing, or omit this interface entirely. 

} 

ताकि आप किसी भी प्रकार है कि addObserver विधि करने के लिए तर्क के रूप में ObserverA विरासत में पारित करने में सक्षम हो जाएगा।

यदि आप थोड़ा स्पष्टीकरण चाहते हैं, तो पढ़ें।

मैंने Bounded Type Parameter का उपयोग करने के लिए पहले इंटरफेस में विधि बदल दी है। जिस तरह से यह घोषित किया गया है, यह किसी भी ऑब्जेक्ट को addObserver विधि के तर्क के रूप में पारित करने की अनुमति देगा जब तक कि यह प्रकार ObserverA है, या यह ObserverA से प्राप्त होता है। चूंकि ObserverBObserverA से विरासत में है, इसलिए आप ObserverA और ObserverB प्रकारों की ऑब्जेक्ट को तर्क के रूप में सुरक्षित रूप से पास कर सकते हैं।

संपादित

अपने स्पष्टीकरण से ऐसा प्रतीत होता है कि आप उन दोनों के बीच किसी भी पदानुक्रमित संबंध के बिना दो अलग इंटरफेस बनाना चाहिए। वे असंबंधित प्रतीत होते हैं क्योंकि आप पहली बार से बचते समय केवल दूसरी विधि के लिए कार्यान्वयन प्रदान करना चाहते हैं। तो, पहले इंटरफेस से विधि के लिए कार्यान्वयन प्रदान करने के लिए खुद को मजबूर करने के बजाय, आपको उन्हें अलग करना चाहिए। इसके लिए एक ओओपी सिद्धांत भी है - Interface Segregation Principle

+0

टाइप नहीं करते हैं, मैंने पहले ही कोशिश की है, समस्या यह है कि 'बी' किसी भी 'ओ ओ ऑब्जर्वरए>>' को स्वीकार करेगा और मैं इसे स्वीकार करना चाहता हूं 'ऑब्जर्वर बी' (या '<ओ उस मामले के लिए ऑब्जर्वर बी>' बढ़ाता है) – Chirlo

+0

@Chirlo: मेरा संपादन देखें। –

+0

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

2

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

public interface Observer<T> { 
    void addObserver(T t); 
} 

public class First implements Observer<First> { 
    @Override 
    public void addObserver(First t) { 
    } 
} 

public class Second implements Observer<Second> { 
    @Override 
    public void addObserver(Second t) { 
    } 
} 

आप देख सकते हैं दोनों पहले और दूसरे वर्गों में एक ही इंटरफ़ेस को लागू लेकिन मानकों के विभिन्न प्रकार के साथ। वे लागू किए गए इंटरफ़ेस को उनके साथ संरक्षित करते हैं, लेकिन Observer<Frist> लिखने के बजाय आप Observer<Integer> या जो भी चाहें लिख सकते हैं।अपने स्पष्टीकरण खाते में

संपादित

ले रहा है इस इंटरफेस पदानुक्रम आप प्रस्तुत भीतर अपने कोड की एक सामान्य कार्यान्वयन किया जाएगा।

interface ObserverA {} 

interface A<T> { 
    void method1(); 
    void addObserver(T o); 
} 

interface ObserverB extends ObserverA {} 

interface B extends A<ObserverB> { 
    void method2(); 
} 
4

आप subinterfaces या subclasses में विधि पैरामीटर प्रकार को संकीर्ण नहीं कर सकते हैं। आप केवल उन्हें विस्तृत कर सकते हैं, क्योंकि उप प्रकार के कार्यान्वयन supertype के अनुबंध को पूरा करने में सक्षम होना चाहिए।

इसी प्रकार, आप वापसी के प्रकार और अपवादों को संकीर्ण कर सकते हैं, लेकिन उसी कारण से उन्हें विस्तृत नहीं कर सकते हैं।

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