2011-06-22 15 views
8

मैं वर्तमान में कुछ वर्गों लिखने के लिए कोशिश कर रहा हूँ और मैं निम्नलिखित समस्या पर समन्वयित आते हैं:वर्ग के प्रकार है जो कई इंटरफेस को लागू करता है

मैं एक वर्ग है कि दो इंटरफेस

interface IA { 
public void doSomething(); 
} 

interface IB { 
public void doSomethingToo(); 
} 
से कुछ कार्यक्षमता लागू करता है लिखने के लिए कोशिश कर रहा हूँ

और मैं दो उन इंटरफेस को लागू करने श्रेणियां होती हैं:

class FooA implements IA, IB{ 

} 

class FooB implements IA, IB{ 

} 

वहाँ मैं जिस तरह से मैं यह कर सकता है:

public <type> thisClassImGonnaUse = returnEitherFooAOrFooB(); 
thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 
+0

इसलिए 'thisClassImGonnaUse' में दोनों विधियां उपलब्ध होनी चाहिए। मुझे नहीं लगता कि यह क्यों काम नहीं करेगा। शायद मुझे कुछ याद आ रही है। –

+0

ठीक है, हाँ थोड़े। 'ThisClassImGonnaUse' का क्या प्रकार है :) –

+0

ठीक है, मुझे लगता है कि मुझे यह मिला।इस प्रकार को एक इंटरफेस होना चाहिए, और 2 इंटरफेस को के रूप में निर्दिष्ट नहीं किया जा सकता है। –

उत्तर

9

एक नए इंटरफ़ेस

public interface IAandB extends IA, IB 

करो और बनाने बना सकते हैं FooA और FooB इसके बजाय इसे कार्यान्वित करें।

+0

आह, कमाल, वह वास्तव में जो मैं खोज रहा था। इसके लिए धन्यवाद :) –

1

आप एक सार आधार वर्ग या किसी अन्य इंटरफेस कि फैली दोनों आइए और आईबी

abstract class Base implements IA, IB{} 

और

class FooA extends Base implements IA, IB{...} 
+1

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

+0

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

1

यह नहीं हो सकता है वास्तव में आप क्या चाहते हैं, लेकिन आप एक 3 इंटरफ़ेस है कि उन दोनों का विस्तार कर सकता है:

interface IAandB extends A, B {} 

फिर FooA और FooB सीधे IAandB बजाय IA और IB लागू करना होगा:

class FooA implements IAandB{} 
class FooB implements IAandB{} 

फिर आप thisClassImGonnaUse को IAandB के प्रकार घोषित कर सकते हैं:

public IAandB thisClassImGonnaUse = returnEitherFooAorFooB(); 
thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 
0

अगर वहाँ संभावना है कि एक वर्ग implementes IAऔरIB, और इस तथ्य समस्या डोमेन आप काम कर रहे के लिए धारणात्मक समझ में आता है, बस एक IAB इस

interface IAB extends IA, IB { /* nothing */ } 
की तरह है

निर्धारित करें यदि यह आपके मामले में समझ में आता है कि आप खुद को पूछ सकते हैं आईएबी के लिए एक अच्छा नाम क्या होगा? यदि आप इसके संतोषजनक उत्तर के साथ आ सकते हैं, तो आप केवल उस इंटरफ़ेस को जोड़ सकते हैं। यदि नहीं, तो अपने दो

thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 

लाइनों के लिए सही जगह FooA या FooB की एक विधि (या इन दोनों में से एक आधार वर्ग) होगा। इस तरह आपको कक्षाओं की प्रकृति के बारे में अनुमान या अनुमान लगाने की ज़रूरत नहीं है जो आपके इंटरफेस को कार्यान्वित करते हैं (जो अमान्य हो सकता है या बाद में संभालने में परेशानी हो सकती है)।

+0

ठीक है, हाँ मैं भी इसके लिए सोच रहा था। मुझे एक समस्या है हालांकि, इंटरफेस में से एक (कहें 'आईए') एक अलग पुस्तकालय से है। –

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

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