如何通过组合来自不同包的接口来创建接口?

情况

对于代码库,我使用的是pion/rtpio包。

我正在尝试RTPwriter通过向其添加Close()功能来扩展接口。目标是做一个NewRTPWritCloser()返回带有组合函数的 writeCloser 的函数。

从包中,我看到作者已经创建了接口RTPWriteCloser

type RTPWriteCloser interface {

    RTPWriter

    io.Closer

}

试图

我这样做是为了重用该功能,这是错误的,但我还不知道替代方案:



func NewRTPWriteCloser(wc io.WriteCloser) rtpio.RTPWriteCloser {

    writeCloser := rtpio.NewRTPWriter(wc)

    return writeCloser

}

并期望wc有自己的Close()功能准备就绪,因此返回的writeCloser将满足接口RTPWriteCloser。但是,我得到了(missing method Close)一个错误。


函数NewRTPWriter()是这样的:


func NewRTPWriter(w io.Writer) RTPWriter {

    return &RawRTPWriter{

        dst: w,

    }

}

问题

  • 我们如何同时从多个嵌入式接口创建一个具有所有所需功能的实例来满足嵌入接口?

  • 在这个例子中,我们想NewRTPWriteCloser为接口创建函数RTPWriteCloser,但是我们不能先创建一个编写器然后再添加关闭函数吗?

  • 我是否必须创建一个 structRTPWriteCloser并重写接受该 struct 的所有必要函数?(似乎效率低下)

搜索过

我自己进行了搜索,例如:interfaces inside interface and combining or extending interfaces,但它们并没有让我明白我的问题。


蓝山帝景
浏览 67回答 2
2回答

德玛西亚99

您应该定义一个适配器结构,将io.Closer语义添加到您的基类型:type WrappingRTPWriteCloser struct {    w RTPWriter    c io.Closer}然后,您应该定义Close满足接口的方法:func (w *WrappingRTPWriteCloser) Close() error {    return w.c.Close()}然后,您应该在创建实例时创建包装结构的新引用:func NewRTPWriteCloser(wc io.WriteCloser) rtpio.RTPWriteCloser {    writeCloser := WrappingRTPWriteCloser{            w: rtpio.NewRTPWriter(wc),            c: wd,    }    return writeCloser}另一种解决方案是使用RTPPipe包开箱即用的函数,它返回一个实例RTPReadCloser和一个RTPWriteCloser实例(将输入通过管道RTPReadCloser传递到RTPWriteCloser输出):// RTPPipe creates a new RTPPipe and returns the reader and writer.func RTPPipe() (RTPReadCloser, RTPWriteCloser) {    r, w := io.Pipe()    return &pipeRTPReader{closer: r, rtpReader: NewRTPReader(r, 1500)}, &pipeRTPWriter{closer: w, rtpWriter: NewRTPWriter(w)}}

波斯汪

我相信您将需要按照建议创建一个新结构来实现您的接口,让我们调用它RawRTPWriterCloser并为Close().但是,您可以将结构嵌入到其他结构中,因此该Close()方法是您需要额外定义的唯一函数:type RawRTPWriterCloser struct {    rtpio.RawRTPWriter}func (rw *RawRTPWriterCloser) Close() error {    panic("add implementation here")}
打开App,查看更多内容
随时随地看视频慕课网APP