接口的组合,顾名思义,就是将两个接口的功能或者两个以上接口的功能组合在一个接口内,新接口拥有其它接口的功能。
java如果想要实现这种功能,需要将这些接口的方法逐一地复制到新的接口里面,因为java只有单继承,但是这显然很傻。而go语言可以非常简单地实现这种效果,下面看代码。
首先定义两个接口
type Duck interface {
AmDuck() bool
}
type Swan interface {
AmSwan() bool
}一个是Duck接口,一个是Swan接口,接口都有各种的方法,而如果拥有Duck和Swan双重功能的接口显然就只有丑小鸭了。因此我们定义一个丑小鸭接口:
type UglyDuckling interface {
Duck
Swan
}按照上面代码的方式,UglyDuckling这个接口就拥有了Duck和Swan两个接口的全部功能。
下面我们来创建具体的实现者和使用者来证明UglyDuckling是否拥有Duck和Swan这两个接口的功能。
首先是创建实现者:
type SmallDuck struct {
Foot int
}
func (smallDuck SmallDuck) AmDuck() bool {
if smallDuck.Foot == 2 {
return true
}
return false
}
func (smallDuck SmallDuck) AmSwan() bool {
if smallDuck.Foot == 2 {
return true
}
return false
}实现者SamllDuck拥有Foot这个属性,实现了AmDuck方法和AmSwam方法,按照go语言接口的实现定义规则,SamllDuck继承了UglyDuckling这个接口。
然后是具体的使用者调用:
func isDuck(duck UglyDuckling) bool {
return duck.AmDuck()
}
func isSwan(duck UglyDuckling) bool {
return duck.AmSwan()
}定义了两个方法,入参为UglyDuckling接口,UglyDuckling接口可以调用Duck和Swan的接口,下面为具体的使用例子。
func main() {
var uglyDuckling UglyDuckling
uglyDuckling = yellow.SmallDuck{Foot: 2}
fmt.Printf("%T %v
", uglyDuckling, uglyDuckling)
fmt.Println(isDuck(uglyDuckling))
fmt.Println(isSwan(uglyDuckling))
}创建UglyDuckling接口变量,并为其赋值,输出接口的类型和值,最后调用上面定义好的两个方法,结果如下:
yellow.SmallDuck {2}
true
true | 留言与评论(共有 0 条评论) “” |