2012-08-12 40 views
20

Đây là mã của tôi:Làm thế nào để thực hiện phương thức giao diện với kiểu trả về là một giao diện trong Golang

type IA interface { 
    FB() IB 
} 

type IB interface { 
    Bar() string 
} 

type A struct { 
    b *B 
} 

func (a *A) FB() *B { 
    return a.b 
} 

type B struct{} 

func (b *B) Bar() string { 
    return "Bar!" 
} 

tôi nhận được một lỗi:

cannot use a (type *A) as type IA in function argument: 
    *A does not implement IA (wrong type for FB method) 
     have FB() *B 
     want FB() IB 

Đây là mã đầy đủ: http://play.golang.org/p/udhsZgW3W2
tôi nên chỉnh sửa giao diện IA hoặc modifi Cấu trúc của mình? Nếu tôi định nghĩa IA, IB trong một gói khác (vì vậy tôi có thể chia sẻ các giao diện này), tôi phải nhập gói của tôi và sử dụng IB như kiểu trả về của A.FB(), có đúng không?

Trả lời

15

Chỉ cần thay đổi

func (a *A) FB() *B { 
    return a.b 
} 

vào

func (a *A) FB() IB { 
    return a.b 
} 

Chắc chắn IB thể được định nghĩa trong gói khác. Vì vậy, nếu cả hai giao diện được định nghĩa trong gói foo và triển khai là trong gói bar, sau đó tuyên bố là

type IA interface { 
    FB() IB 
} 

trong khi thi là

func (a *A) FB() foo.IB { 
    return a.b 
} 
+0

này không trả lời câu hỏi. Vấn đề là chúng tôi muốn có các giao diện trong một tập tin mới mà không thể thay đổi định nghĩa gốc. – epsalon

+0

@epsalon Vấn đề của bạn liên quan đến vấn đề ban đầu như thế nào? Vui lòng mô tả nhiều hơn một chút. – Mue

+2

Tôi nghĩ câu hỏi của @ epsalon khá thích hợp. Giả sử cả A và B được định nghĩa trong một gói riêng biệt và không thể truy cập được. Làm thế nào có thể xác định giao diện IA và IB hồi tưởng? Một ví dụ về khi bạn có thể muốn làm điều này là nếu bạn đang cố gắng xác định các giao diện này để sử dụng các mocks cho cả A và B trong một gói hoàn toàn khác mà không thể sửa đổi các tệp gốc trong đó A và B được khai báo. – ishaaq

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