父类可以调用子类的办法么?

636 views
Skip to first unread message

lulu Lee

unread,
Nov 28, 2012, 2:46:30 AM11/28/12
to golang-china
大家好,

我想简单封装下一个http.Handler的基类,以支持filter做统一处理。
代码大概如下:

// Filter, 可以添加到特定的Handler中
type Filter interface {
    BeforeServeHTTP(http.ResponseWriter, *http.Request) bool
    AfterServeHTTP(http.ResponseWriter, *http.Request) bool
}

type BaseHandler struct {
    Filters []Filter
}

func (b BaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if b.Filters != nil {
        for _, filter := range b.Filters {
            if filter.BeforeServeHTTP(w, r) == false {
                return
            }
        }
    }

    b.Handle(w, r)

    if b.Filters != nil {
        for _, filter := range b.Filters {
            if filter.AfterServeHTTP(w, r) == false {
                return
            }
        }
    }
}

// 子类重写这个方法
func (b BaseHandler) Handle(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "BaseHandler")
}


一个子类的实现:

type DemoHandler struct {
    BaseHandler
}

func (d *DemoHandler) Handle(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "DemoHandler")
}

注意基类 BaseHandler 中红色的代码部分,是不能调用到子类DemoHandler的Handle方法的。
请问有什么办法可以实现这个么?
或者有比较好的其他实现方式么?


--
@QLeelulu | FaWave, Net4 Team | qlee...@gmail.com | 学海无涯,回头是岸 

lihui

unread,
Nov 28, 2012, 3:05:14 AM11/28/12
to golang...@googlegroups.com
转变思路,我们仍然可以解决问题,比如可以定义如下算术:

filter =filter+filter =>两个filter相加等于一个filter
handler=filter(handler) =》将filter作用到一个handler上,得到另外一个handler


2012/11/28 lulu Lee <qlee...@gmail.com>

--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
 
 
 

lulu Lee

unread,
Nov 28, 2012, 3:23:46 AM11/28/12
to golang...@googlegroups.com
这样是可以,只是不够优雅,代码会臃肿。
可以实现的途径有很多,我只是想用一种简单、优雅点的方式

Steve Wang

unread,
Nov 28, 2012, 4:18:48 AM11/28/12
to golang...@googlegroups.com
go里没有父类子类,这样说很让人疑惑。
抽象的地方都可以用接口,比如可以考虑:
b.handler.Hande()
handler是一个接口对象

2012/11/28 lulu Lee <qlee...@gmail.com>

lihui

unread,
Nov 28, 2012, 5:25:05 AM11/28/12
to golang...@googlegroups.com
如果你把filter注册到路由上,用路由自动应用过滤器,那么也会很简洁。
我觉得这种方式更灵活更优雅,更那个那个易懂。

2012/11/28 lulu Lee <qlee...@gmail.com>

Zero Hero

unread,
Dec 4, 2012, 5:19:10 AM12/4/12
to golang...@googlegroups.com
-- 在父类的struct中添加一个接口,然后就可以调用接口里的方法了,这样就是用has a 来代替 is a 了:)

徐新华

unread,
Dec 4, 2012, 11:39:49 PM12/4/12
to golang...@googlegroups.com
考虑用接口实现,别总想着继承。
Reply all
Reply to author
Forward
0 new messages