go中的子类型超类型

use*_*195 6 go

来自 OOP 范式并从 OOP 语言移植代码,我现在遇到了一个问题,该问题通过抽象在 OOP 中解决,所以我想知道如何在 Go 中解决以下问题,该问题遵循组合而不是继承。

在这种情况下,我的 ValueObjects(DTO、POJO 等)由其他 ValueObjects 组成。我通过返回 json 的 Web 服务调用来填充它们,所以基本上我的函数/方法调用对于所有类型和子类型都是通用的。

我的超级类型EntityVO

type EntityVO struct {
    EntityName    string
    EntityType    string
    PublicationId string
    Version       string
}
Run Code Online (Sandbox Code Playgroud)

由 EntityVO 组成的子类型 1

type ArticleVO struct {
    EntityVO
    ContentSize string
    Created     string
}
Run Code Online (Sandbox Code Playgroud)

由 EntityVO 组成的子类型 2,具有自己独特的字段集

type CollectionVO struct {
    EntityVO
    ProductId string
    Position string
}
Run Code Online (Sandbox Code Playgroud)

我正在调用 Web 服务来检索数据并填充这些 VO。

早些时候,我有一个函数来调用 Web 服务并填充数据,但现在我正在为每个 VO 复制代码。

type Article struct{}

func (a *Article) RequestList(articleVO *valueObject.ArticleVO) (*valueObject.ArticleVO, error) { 
    // some code
}
Run Code Online (Sandbox Code Playgroud)

复制相同的代码但更改签名。

type Collection struct{}

func (c * Collection) RequestList(collectionVO *valueObject.CollectionVO) (*valueObject.ArticleVO, error) { 
    // some code - duplicate same as above except method signature
}
Run Code Online (Sandbox Code Playgroud)

我有几个实体,仅仅因为我的 VO 不同,我被迫复制代码并迎合我拥有的每种类型的 VO。在 OOP 中,子类型可以传递给接受超类型的函数,但在 go 中不能,所以想知道应该如何做,这样我就不会得到仅签名不同的重复代码?

在这种情况下有什么更好的方法建议吗?

Ver*_*ous 3

这就是 golang 接口大放异彩的地方。

然而值得注意的是,在 golang 中编写子类/继承代码是很困难的。我们更愿意将其视为组合。

type EntityVO interface {
    GetName() string
    SetName(string) error
    GetType() string
    ...
}

type EntityVOImpl struct {
    EntityName    string
    EntityType    string
    PublicationId string
    Version       string
}

func (e EntityVOImpl) GetName() string {
    return e.EntityName
}

...

type ArticleVOImpl struct {
    EntityVOImpl
    ContentSize string
    Created     string
}

type CollectionVOImpl struct {
    EntityVO
    ProductId string
    Position string
}

// CODE

func (e *Entity) RequestList(entityVO valueObject.EntityVO) (valueObject.EntityVO, error) { 
    // some code
}
Run Code Online (Sandbox Code Playgroud)

此外,只要您的接口文件是共享的,我认为通过线路发送/编组/解组结构就不应该有任何问题。