对组合与继承感到困惑

问题描述 投票:0回答:1

我正在尝试找到最好的方法来解决这个问题,我通常会用另一种语言的继承来解决这个问题,但很难找到解决问题的方法。

我有许多结构,它们都共享一个公共的嵌入结构。我想对这些结构使用通用的“方法”,并允许它们更新嵌入结构的成员。

type EventMetaData struct {
    SystemId  string `json:"system_id"`
    Timestamp string `json:"timestamp"`
}

func (evd *EventMetaData) SetSystemId(systemId string) {
    evd.SystemId = systemId
}

type LoginEvent struct {
    *EventMetaData
    UserId    string `json:"user_id"`
    Method    string `json:"method"`
    Timestamp string `json:"timestamp"`
}

type LogoutEvent struct {
    *EventMetaData
    UserId string `json:"user_id"`
}

type CanSetEventMetaData interface {
    SetSystemId(string)
}

func FromPayload(ev *CanSetEventMetaData, payload []byte) (*E, error) {
    err := json.Unmarshal(payload, ev)
    if err != nil {
        return nil, err
    }
    ev.SetSystemId(config.systemId)
    return ev, nil
}

但是,ev.SetSystemId 行返回未解析的引用。

在我使用过的其他语言中,我会使用 SetSystemId 方法继承基类。我明白这不是正确的方法。

go oop inheritance
1个回答
0
投票

你所做的是正确的,但是,参数

ev
是一个指向接口的指针,它不是一个接口。修复:

func FromPayload(ev CanSetEventMetaData, payload []byte) (*E, error) {
...
}
© www.soinside.com 2019 - 2024. All rights reserved.