Một giải pháp chung là giới thiệu một loại mới. Nó có thể được tham gia nhiều hơn, nhưng nó có lợi thế là làm việc cho bất kỳ loại nào không xác định vô hạn của chính nó.
Nếu T
là một loại lteq
được xác định, bạn có thể định nghĩa InfiniteOr<T>
với lteq
một cái gì đó như thế này:
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())
Tôi sẽ để nó cho bạn dịch cái này sang cú pháp Java chính xác. Tôi hy vọng các ý tưởng là rõ ràng; nhưng hãy để tôi đánh vần chúng ra
Ý tưởng là tạo ra một loại mới có tất cả các giá trị giống như một số loại đã có sẵn, cộng với một giá trị đặc biệt mà theo như bạn có thể nói thông qua các phương thức công cộng, hành động chính xác theo cách bạn muốn hành động vô cùng, ví dụ như nó lớn hơn còn gì nữa không. Tôi đang sử dụng null
để thể hiện sự vô hạn ở đây, vì điều đó có vẻ đơn giản nhất trong Java.
Nếu bạn muốn thêm các phép toán số học, hãy quyết định những gì họ nên làm, sau đó thực hiện điều đó. Có thể đơn giản nhất nếu bạn xử lý các trường hợp vô hạn trước, sau đó sử dụng lại các hoạt động hiện có trên các giá trị hữu hạn của loại ban đầu.
Có thể có hoặc không có một mô hình chung về việc có hay không có lợi khi áp dụng một quy ước xử lý các hành vi vô cực bên trái trước các hành vi phạm tội bên phải hoặc ngược lại; Tôi không thể nói mà không dùng thử, nhưng với mức độ thấp hơn hoặc bằng ( lteq
) tôi nghĩ rằng việc nhìn vào vô cực bên tay phải trước sẽ đơn giản hơn. Tôi lưu ý rằng đó không phảilteq
là giao hoán, nhưng và là; có lẽ điều đó có liên quanadd
mul
Lưu ý: đưa ra một định nghĩa tốt về những gì sẽ xảy ra trên các giá trị vô hạn không phải lúc nào cũng dễ dàng. Nó là để so sánh, cộng và nhân, nhưng có thể không trừ. Ngoài ra, có một sự khác biệt giữa số thứ tự vô hạn và số thứ tự mà bạn có thể muốn chú ý đến.