วิธีแก้ปัญหาทั่วไปคือการแนะนำรูปแบบใหม่ อาจมีส่วนเกี่ยวข้องมากกว่า แต่มีข้อได้เปรียบในการทำงานกับประเภทใด ๆ ที่ไม่ได้กำหนดขอบเขตของตัวเอง
หากT
เป็นประเภทที่lteq
กำหนดไว้คุณสามารถกำหนดInfiniteOr<T>
ด้วยlteq
บางสิ่งดังนี้:
class InfiniteOr with type parameter T:
field the_T of type null-or-an-actual-T
isInfinite()
return this.the_T == null
getFinite():
assert(!isInfinite());
return this.the_T
lteq(that)
if that.isInfinite()
return true
if this.isInfinite()
return false
return this.getFinite().lteq(that.getFinite())
ฉันจะปล่อยให้คุณแปลสิ่งนี้เป็นไวยากรณ์ Java ที่แน่นอน ฉันหวังว่าความคิดนั้นชัดเจน แต่ให้ฉันสะกดมันออกไป
แนวคิดคือการสร้างรูปแบบใหม่ที่มีค่าเหมือนกันทั้งหมดที่มีอยู่แล้วบางประเภทรวมถึงค่าพิเศษหนึ่งอย่างที่คุณสามารถบอกได้ด้วยวิธีการสาธารณะ - ทำหน้าที่อย่างที่คุณต้องการให้อินฟินิตี้ทำ สิ่งอื่นใด ฉันใช้null
เพื่อเป็นตัวแทนอนันต์ที่นี่เนื่องจากที่ดูเหมือนตรงไปตรงมาที่สุดใน Java
หากคุณต้องการเพิ่มการดำเนินการทางคณิตศาสตร์ให้ตัดสินใจว่าควรทำอย่างไรและดำเนินการนั้น มันอาจจะง่ายที่สุดถ้าคุณจัดการกับกรณีที่ไม่มีที่สิ้นสุดก่อนจากนั้นนำการดำเนินการที่มีอยู่มาใช้ใหม่ในค่า จำกัด ของประเภทดั้งเดิม
อาจมีหรือไม่มีรูปแบบทั่วไปว่าจะเป็นประโยชน์หรือไม่ที่จะนำมาใช้เป็นแนวทางในการจัดการกับ infinities ด้านซ้ายก่อน infinities ด้านขวาหรือในทางกลับกัน; ฉันไม่สามารถบอกได้โดยไม่ต้องลอง แต่สำหรับน้อยกว่าหรือเท่ากับ ( lteq
) ฉันคิดว่ามันง่ายกว่าที่จะดูอินฟินิตี้ทางด้านขวาก่อน ผมทราบว่าlteq
เป็นไม่ได้สับเปลี่ยน แต่add
และmul
มี; อาจจะเกี่ยวข้อง
หมายเหตุ: การหาคำจำกัดความที่ดีว่าอะไรควรเกิดขึ้นกับค่าอนันต์ไม่ใช่เรื่องง่ายเสมอไป เป็นการเปรียบเทียบการบวกและการคูณ แต่อาจไม่เป็นการลบ นอกจากนี้ยังมีความแตกต่างระหว่างตัวเลขที่ไม่มีที่สิ้นสุดและลำดับที่คุณอาจต้องการที่จะใส่ใจ