Tôi đã cố gắng để gỡ lỗi một số mã sử dụng mixin và tôi đã có thể làm giảm vấn đề của tôi xuống ví dụ này. Tôi có một lớp cha mẹ nhận các phương thức thông qua một mixin và một lớp con kế thừa từ cha mẹ. Nếu tôi cố gắng thay thế một phương thức trên một thể hiện của lớp con nó hoạt động UNLESS phương thức mà tôi đang thay thế được gọi trên một cá thể của lớp cha trước khi nó được thay thế. Nếu nó đã được gọi là sau đó tôi không thể thay thế nóGroovy đang làm gì ở đây?
Vì vậy, mã này:
class M {
protected foo() { println 'foo' }
}
@Mixin(M) class A {
def bar() { foo() }
}
class B extends A {}
def b = new B()
def a = new A()
a.bar() //<-- comment out this line and see the difference
b.metaClass.foo = {println 'winning'}
b.bar()
sẽ mang lại:
foo
foo
Nhưng nếu bạn nhận xét ra dòng 13 (một trong những bình luận nói rằng để nhận xét nó ra), bạn sẽ nhận được:
chiến thắng
Tại sao điều này xảy ra? Tôi hy vọng có một số cách này có ý nghĩa trong bối cảnh của mô hình metaclass Groovy, nhưng tôi không nhận được nó.
Đây là Groovy 1.8.6
tôi cũng có thể tái tạo điều này trong Groovy 1.8.4. Mùi như một lỗi đối với tôi; nhưng tôi không quá nhiều vào lập trình meta Groovy, vì vậy tôi không biết. – epidemian
Cảm ơn bạn đã lưu ý, tôi chắc chắn sẽ bao gồm điều đó nếu tôi kết thúc việc gửi một lỗi lên đó. – mfollett
Tôi muốn hỏi điều này trong danh sách gửi thư của người dùng groovy, có mùi giống như một lỗi đối với tôi ... –