สมมติว่าคุณมีสองอินเตอร์เฟส:
interface Readable {
public void read();
}
interface Writable {
public void write();
}
ในบางกรณีวัตถุที่ใช้งานสามารถรองรับหนึ่งในสิ่งเหล่านี้ แต่ในหลายกรณีการใช้งานจะสนับสนุนทั้งสองอินเตอร์เฟส ผู้ใช้อินเทอร์เฟซจะต้องทำสิ่งที่ชอบ:
// can't write to it without explicit casting
Readable myObject = new MyObject();
// can't read from it without explicit casting
Writable myObject = new MyObject();
// tight coupling to actual implementation
MyObject myObject = new MyObject();
ไม่มีตัวเลือกเหล่านี้สะดวกมากยิ่งขึ้นดังนั้นเมื่อพิจารณาว่าคุณต้องการให้นี่เป็นพารามิเตอร์วิธี
ทางออกหนึ่งคือการประกาศส่วนต่อประสานการห่อ:
interface TheWholeShabam extends Readable, Writable {}
แต่นี่มีปัญหาหนึ่งปัญหา: การใช้งานทั้งหมดที่รองรับทั้งแบบอ่านได้และเขียนได้จะต้องใช้ TheWholeShabam หากพวกเขาต้องการที่จะเข้ากันได้กับคนที่ใช้อินเทอร์เฟซ แม้ว่าจะไม่ได้มีอะไรนอกเหนือไปจากการรับประกันว่ามีอินเทอร์เฟซทั้งสอง
มีวิธีแก้ไขปัญหานี้หมดจดหรือฉันควรจะไปหาส่วนต่อประสานห่อหุ้ม?
UPDATE
ในความเป็นจริงมักจะจำเป็นต้องมีวัตถุที่สามารถอ่านได้และเขียนได้ดังนั้นเพียงแค่แยกความกังวลในข้อโต้แย้งไม่ใช่วิธีที่สะอาด
UPDATE2
(แยกเป็นคำตอบดังนั้นจึงง่ายที่จะแสดงความคิดเห็นใน)
Update3
โปรดระวังว่าการใช้ usecase หลักนี้ไม่ใช่สตรีม (แม้ว่าจะต้องได้รับการสนับสนุนด้วย) ลำธารทำให้เกิดความแตกต่างอย่างมากระหว่างอินพุตและเอาต์พุตและมีการแบ่งแยกหน้าที่ที่ชัดเจน แต่ลองนึกถึงสิ่งที่คล้ายกับ bytebuffer ที่คุณต้องการวัตถุหนึ่งชิ้นที่คุณสามารถเขียนและอ่านได้วัตถุหนึ่งที่มีสถานะเฉพาะเจาะจงติดอยู่ วัตถุเหล่านี้มีอยู่เพราะมีประโยชน์มากสำหรับบางสิ่งเช่น I / O แบบอะซิงโครนัสการเข้ารหัส ...
UPDATE4
หนึ่งในสิ่งแรกที่ฉันลองคือเหมือนกับข้อเสนอแนะด้านล่าง (ตรวจสอบคำตอบที่ยอมรับ) แต่มันพิสูจน์แล้วว่าบอบบางเกินไป
สมมติว่าคุณมีคลาสที่ต้องส่งคืนชนิด:
public <RW extends Readable & Writable> RW getItAll();
หากคุณเรียกใช้เมธอดนี้ RW ทั่วไปจะถูกกำหนดโดยตัวแปรที่รับวัตถุดังนั้นคุณต้องมีวิธีในการอธิบาย var นี้
MyObject myObject = someInstance.getItAll();
สิ่งนี้จะใช้งานได้ แต่จะเชื่อมโยงกับการนำไปใช้อีกครั้งและอาจโยนการรับคลาสแคสต์ที่รันไทม์ (ขึ้นอยู่กับสิ่งที่ส่งคืน)
นอกจากนี้หากคุณต้องการตัวแปรคลาสของประเภท RW คุณจะต้องกำหนดค่าทั่วไปในระดับชั้นเรียน