猿问

避免在“子类型”之间重复代码

我正在将一个旧的 Java 项目重写为 Go。


我已经在工作中完成了一些 Go,但我不知道如何将我的 OOP(带有抽象类等)转换为 Go 哲学。


在这个想法中,我有两种类型(很快就会有 3 种),它们有一些通用的方法,但其他一些类型(最多只有 1 或 2 个)应该具有相同的签名,但不具有相同的主体。


我知道 Go 没有某种继承。现在我有这样的事情:


type A struct {...}

func (a *A) M1 (){ stuff1 }

func (a *A) M2 (){ stuff2 }

func (a *A) SM (){ special stuff A }

然后:


type B struct {...}

func (b *B) M1 (){ stuff1 }

func (b *B) M2 (){ stuff2 }

func (b *B) SM (){ special stuff B }

我不知道 Go 是如何做到这一点的。在 Java 中,我做了一个抽象类,然后用我的两个具体类实现了它。


我想要的是不必重复 M1() 和 M2(),而是能够有一个泛型类型来调用这些方法,然后只需为这两种类型定义 SM() 即可。


喵喔喔
浏览 107回答 2
2回答

莫回无

您可以嵌入一个结构,例如:type Common struct {}func (c *Common) M1() {    fmt.Println("M1")}func (c *Common) M2() {    fmt.Println("M2")}type A struct {    Common}func (a *A) SM() {    fmt.Println("A SM()")}type B struct {    Common}func (b *B) SM() {    fmt.Println("B SM()")}   type Thing interface {    M1()    M2()    SM()}func main() {    var a Thing = &A{}    var b Thing = &B{}    a.M1()    b.M2()    a.SM()    b.SM()}https://play.golang.org/p/Q3mIH_W8X44

宝慕林4294392

有几种不同的方法可以解决这个问题 - 嵌入并不是唯一的答案。如果这些方法想要从伪代码中定义的类型访问数据(例如A.M1需要访问 的字段A),那么嵌入对您没有帮助,因为嵌入类型不知道它嵌入的类型。您需要从整体上重新考虑您的设计并将其视为 Go 程序,而不是将其设计为 Java 程序并尝试使这些概念在 Go 中发挥作用。正如许多人发现的那样,尝试在 Go 中进行 OOP 设计往往会带来很大的挫败感,但成功率却很低。另一方面,如果这些方法不需要访问任何字段,那么它们为什么是方法呢?这些可能只是纯函数,这将使它们更易于使用和推理,并且完全消除嵌入或伪造继承的任何担忧。
随时随地看视频慕课网APP

相关分类

Go
我要回答