2010-06-20 28 views

Trả lời

15

Vì quy tắc quan trọng của hàm ý là chỉ có một quy tắc được áp dụng để thực hiện kiểm tra kiểu biểu thức (phụ), pimping RichString để bổ sung thêm vào các phương thức mà nó thêm vào String sẽ không cho phép bạn xem các phương thức của lớp RicherString (nếu bạn muốn) như thể chúng có sẵn trực tiếp trên các cá thể String. Họ sẽ có sẵn nếu bạn có một RichString, tất nhiên, và RichString trường hợp là tầm thường có sẵn từ String trường hợp bằng cách đơn giản loại ascription. Nhưng vẫn còn, nó không phải là những gì mọi người sẽ gọi thuận tiện.

Vì vậy, cho mục đích thực tế, những gì bạn đang yêu cầu không thực sự có thể có trong Scala.

Mặt khác, nếu bạn chỉ cần thay thế tăng thêm String, bạn chỉ có thể xác định lớp chuỗi tăng cường của riêng bạn. Nếu không có sự chồng chéo giữa các phương thức nó định nghĩa và các phương thức được định nghĩa trong RichString, sẽ không bao giờ có bất kỳ sự mơ hồ nào đối với trình biên dịch để giải quyết trong quyết định áp dụng. Đó có lẽ là đủ tốt, phải không?

Ngoài ra, cách tiếp cận này (một chuyển đổi tiềm ẩn thay thế, không trùng lặp) sẽ không bị ngắt khi bạn chuyển sang Scala 2.8, có StringOps thay cho RichString.

Để làm điều này, bạn sẽ làm điều gì đó tương tự như sau:

class MyRichString(underlying:String){ 
    def myNewMethod = { ... } 
} 

implicit def addMyMethods(s:String)=new MyRichString(s) 
+0

Awesome, thực hiện chính xác những gì tôi muốn. Cảm ơn. – pr1001

+0

Trên thực tế, mô hình đó phổ biến đến nỗi [các lớp ẩn] (http://docs.scala-lang.org/overviews/core/implicit-classes.html) được đưa vào như là chính thức. – jeslg

Các vấn đề liên quan