我有一个golang界面我
type I interface {
A()
B()
}
此界面是type S struct
的元素。现在我想在这个接口中添加一个函数C(),它将被称为S类型的对象。
但是这个接口是由许多其他类型实现的(例如:T)。
在编译时,我得到一个错误为T does not implement C()
。
一个解决方法是在T中添加C()的虚拟实现,它只返回T的返回类型的值。
有没有更好的方法呢?
答案 0 :(得分:3)
您可以使用单个结构实现多个接口,如下所示。然后,您可以让方法接受不同的接口作为参数。
如果你需要一个利用来自两个接口的方法的单个函数,你可以将指针作为单独的参数传递给你的结构(每个接口一个),但没有什么能阻止一个接口满足多个接口的范围更小的接口,所以你可以创建第三个接口,封装两者的功能来处理这些情况(参见IJ接口示例)。
package main
import (
"fmt"
)
type I interface {
A()
B()
}
// interface 'J' could be defined in an external package, it doesn't matter
type J interface {
C()
}
// encapsulate I & J interfaces as IJ
type IJ interface {
J
I
}
// S will satisfy interfaces I, J & IJ
type S struct {}
func (s *S) A(){
fmt.Println("A")
}
func (s *S) B(){
fmt.Println("B")
}
func (s *S) C(){
fmt.Println("C")
}
func main() {
s := &S{}
doWithI(s)
doWithJ(s)
fmt.Println("===================================")
doWithIAndJ(s)
}
func doWithI(in I){
in.A()
in.B()
}
func doWithJ(in J){
in.C()
}
func doWithIAndJ(in IJ){
in.A()
in.B()
in.C()
}