คุณไม่สามารถทำสิ่งนี้ได้โดยตรงในคลาสเดียวเนื่องจากคำจำกัดความของคลาสด้านล่างไม่สามารถรวบรวมได้เนื่องจากการลบประเภททั่วไปและการประกาศอินเตอร์เฟสที่ซ้ำกัน
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 ชั้น แต่ในกรณีของการโทรคุณต้องได้รับการอ้างอิงถึงผู้บริโภคที่ใช้งานเป็นครั้งแรกเนื่องจากนี่ไม่ใช่วัตถุสำหรับผู้บริโภคเพียงชิ้นเดียว