类型A满足B类要求

时间:2014-11-11 15:55:05

标签: go

我有一个关于数据类型/结构能够满足函数调用中预期的另一种类型的要求的问题。

在用Go编写的RSS和Atom Feed处理程序的feed.go中,有一个New辅助函数,它将ChannelHandlerFunc作为第三个参数,您可以看到它作为参数传递给a NewDatabaseChannelHandler,它返回一个DatabaseHandler,如下所示。 DatabaseHandler中嵌入了ChannelHandler。您可以在New函数中看到NewDatabaseChannelHandler(即DatabaseHandler)的返回值作为第3个参数传递给NewWithHandlers。但是,如您所见,NewWithHandlers需要ChannelHandler作为第三个参数。

问题:为什么NewWithHandlersDatabaseHandler作为第三个参数的返回值传递NewDatabaseChannelHandler时不会抛出错误。 NewWithHandlers期望ChannelHandler不是DatabaseHandler?

func New(cachetimeout int, enforcecachelimit bool, ch ChannelHandlerFunc, ih ItemHandlerFunc) *Feed {
    db := NewDatabase()
    f := NewWithHandlers(cachetimeout, enforcecachelimit, NewDatabaseChannelHandler(db, ch), NewDatabaseItemHandler(db, ih))
    f.database = db
    return f
}

然后NewWithHandlers接受ChannelHandler作为第三个参数

// NewWithHandler creates a new feed with handlers
// People should use this approach from now on
func NewWithHandlers(cachetimeout int, enforcecachelimit bool, ch ChannelHandler, ih ItemHandler) *Feed {
    v := new(Feed)
    v.CacheTimeout = cachetimeout
    v.EnforceCacheLimit = enforcecachelimit
    v.Type = "none"
    v.channelHandler = ch
    v.itemHandler = ih
    return v
}

file是NewDatabaseChannelHandler

的源代码

但是,NewDatabaseChannelHandler不返回ChannelHandler,它返回一个DatabaseHandler

func NewDatabaseChannelHandler(db *database, chanhandler ChannelHandler) ChannelHandler {
    database := new(databaseHandler)
    database.db = db
    database.chanhandler = chanhandler
    return database
}

type databaseHandler struct {
    db          *database
    itemhandler ItemHandler
    chanhandler ChannelHandler
}

1 个答案:

答案 0 :(得分:1)

DatabaseHandler使用此方法满足ChannelHandler接口:

func (d *databaseHandler) ProcessChannels(f *Feed, ch []*Channel)

界面要求:

type ChannelHandler interface {
    ProcessChannels(f *Feed, newchannels []*Channel)
}