आप इसे सीधे एक कक्षा में नहीं कर सकते क्योंकि सामान्य प्रकार और डुप्लिकेट इंटरफ़ेस घोषणा के उन्मूलन के कारण नीचे वर्ग परिभाषा को संकलित नहीं किया जा सकता है।
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
एक वर्ग में एक ही उपभोग के संचालन को पैक करने के लिए किसी अन्य समाधान के लिए आपकी कक्षा को परिभाषित करने की आवश्यकता है:
class TwoTypesConsumer { ... }
जो व्यर्थ है क्योंकि आपको दोनों ऑपरेशनों की परिभाषा को दोहराने / डुप्लिकेट करने की आवश्यकता है और उन्हें इंटरफ़ेस से संदर्भित नहीं किया जाएगा। IMHO ऐसा करने वाला एक छोटा और कोड दोहराव है जिससे मैं बचने की कोशिश कर रहा हूं।
यह एक संकेतक भी हो सकता है कि 2 अलग-अलग वस्तुओं (यदि वे युग्मित नहीं हैं) का उपभोग करने के लिए एक वर्ग में बहुत अधिक जिम्मेदारी है।
हालाँकि, मैं क्या कर रहा हूँ और आप क्या कर सकते हैं स्पष्ट फैक्ट्री ऑब्जेक्ट को जोड़ने के लिए निम्नलिखित उपभोक्ताओं को निम्नलिखित तरीके से बनाना है:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
यदि वास्तव में वे प्रकार वास्तव में युग्मित (संबंधित) हैं तो मैं इस तरह से एक कार्यान्वयन बनाने की सिफारिश करूंगा:
class TwoTypesConsumerFactory {
// shared objects goes here
private class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato tomato) {
// you can access shared objects here
}
}
private class AppleConsumer implements Consumer<Apple> {
public void consume(Apple apple) {
// you can access shared objects here
}
}
// It is really important to return generic Consumer<Apple> here
// instead of AppleConsumer. The classes should be rather private.
public Consumer<Apple> createAppleConsumer() {
return new AppleConsumer();
}
// ...and the same here
public Consumer<Tomato> createTomatoConsumer() {
return new TomatoConsumer();
}
}
फायदा यह है कि फैक्ट्री क्लास दोनों कार्यान्वयनों को जानता है, एक साझा स्थिति है (यदि आवश्यक हो) और आप जरूरत पड़ने पर अधिक युग्मित उपभोक्ताओं को वापस कर सकते हैं। कोई भी दोहराई जाने वाली खपत विधि नहीं है जो इंटरफ़ेस से निकाली गई हो।
कृपया ध्यान दें कि प्रत्येक उपभोक्ता स्वतंत्र (अभी भी निजी) वर्ग हो सकता है यदि वे पूरी तरह से संबंधित नहीं हैं।
उस समाधान का नकारात्मक पहलू एक उच्च श्रेणी की जटिलता है (भले ही यह एक जावा फ़ाइल हो सकती है) और उपभोग की विधि तक पहुंचने के लिए आपको इसके बजाय एक और कॉल की आवश्यकता है:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
आपके पास:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
संक्षेप में आप कर सकते हैं परिभाषित 2 भीतरी वर्गों का उपयोग एक उच्च-स्तरीय कक्षा में 2 सामान्य उपभोक्ताओं लेकिन बुला के मामले में आप उचित पहले एक संदर्भ प्राप्त करने की आवश्यकता को लागू करने के रूप में यह केवल एक उपभोक्ता वस्तु नहीं किया जा सकता उपभोक्ता।