-1

我需要使用几乎相同的字段和方法创建多个具有相同操作的结构。我想,与其这样做,不如创建一个结构并使用接口来限制交互。效果很好!现在的问题。我希望这些方法是可链接的。为此,方法需要返回对结构的引用。这样做之后,所有退货都抱怨(struct) does not implement <interface> (wrong type for <method> method). 这是预期的。

问题是,是否可以使用具有多个具有可链接方法的接口的单个​​结构?还是为每个接口创建单独的、重复的结构是唯一的方法?

我想过使用组合,但我仍然需要定义将调用嵌入式结构方法的方法,在这种情况下,创建新的纯结构没有区别。

示例问题:

https://play.golang.org/p/JrsHATdi2dr

package main

import (
    "fmt"
)

type A interface {
    SetA(string) A
    Done()
}

type B interface {
    SetB(string) B
    Done()
}

type t struct {
    a string
    b string
}

func (t *t) SetA(a string) *t { t.a = a; return t }
func (t *t) SetB(b string) *t { t.b = b; return t }
func (t *t) Done()            { fmt.Println(t.a, t.b) }

func NewTA() A {
    return &t{}
}

func NewTB() B {
    return &t{}
}

func main() {
    fmt.Println("Hello, playground")

    ta := NewTA()
    ta.SetA("a")
    ta.Done()

    tb := NewTB()
    tb.SetB("b")
    tb.Done()
}

4

1 回答 1

0

当您*t用作返回类型时SetASetB这意味着t不实现 A 和 B 接口。的签名SetASetB函数*t相应地与接口 A 和 B 不匹配。

准确地SetA(a string) ASetA(a string) *t不一样的想法。您在接口中用作A返回类型,SetA但在接口中*t用作返回类型t,go 不支持。SetB功能相同

如果您这样做,那么它将起作用,因为现在函数签名匹配

func (t *t) SetA(a string) A { t.a = a; return A(t) }
func (t *t) SetB(b string) B { t.b = b; return B(t) }

去游乐场的代码在这里

于 2020-06-06T18:54:31.603 回答