2010-04-30 32 views
6

Tôi đã bắt đầu học Groovy và hiện đang xem xét chức năng metaclass. Tôi đã thấy các ví dụ về việc thêm một phương thức mới, và loại bỏ tất cả các phương thức, nhưng không có gì về việc loại bỏ một phương thức duy nhất. Ví dụ:Loại bỏ phương pháp Metaclass đơn

String.metaClass.foo = {delegate.toUpperCase()} 
String.metaClass.bar = {delegate.toLowerCase()} 

với các tác dụng phụ rõ ràng. Bây giờ tôi đã thấy rằng bạn có thể nói

String.metaClass = null 

Để xóa tất cả các phương pháp. Tôi mong chờ người ta có thể nói điều gì đó dọc theo dòng của

String.metaClass.foo = null 

để loại bỏ String.foo(), nhưng có String.bar() vẫn, tuy nhiên tuyên bố này dường như không có hiệu lực. Có cách nào để nói phương thức foo() sẽ không còn được định nghĩa nữa, mà không ảnh hưởng đến bar() hay bất kỳ phương thức nào khác được thêm vào?

Trả lời

6

Nếu bạn tìm kiếm this webpage cho "loại bỏ phương pháp", nó nói rằng bạn sẽ có thể loại bỏ một phương pháp bằng cách sử dụng cú pháp chính xác mà bạn đã đề xuất ở trên. Nhưng tôi đã thử nghiệm nó, và bạn nói đúng, nó dường như không hoạt động.

Giải pháp thay thế là gán một đóng cửa để ném MissingMethodException, đó là những gì xảy ra theo mặc định khi bạn gọi một phương thức không tồn tại, ví dụ:

// Add method 
String.metaClass.foo = {delegate.toUpperCase()} 

// Remove method 
def removeMethod = {throw new MissingMethodException()} 
String.metaClass.foo = removeMethod 

Phải thừa nhận rằng đây không phải là giải pháp dễ chịu nhất.

1

Là một followup, tôi gửi một báo cáo lỗi ở đây:

https://issues.apache.org/jira/browse/GROOVY-4189

Và các tài liệu đã được thay đổi tại

Xem các báo cáo lỗi vì lý do này đã không bao giờ thực hiện

Câu trả lời của Don là cách tốt nhất xung quanh

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