У меня есть 3 структуры, которые похожи примерно на 70%.Поэтому я хотел бы извлечь некоторую общую часть и создать некоторые расширения с конкретными методами и полями.
Окончательная структура будет работать следующим образом:
метод .Start()
изCommon
называется
Start()
вызывает метод .Name()
из определенной части, последняя возвращает строку
возвращаемый результатобрабатывается в (*Common).Process()
, иногда он должен вызывать определенные Format()
Но!Определенная часть должна вызывать метод Общей части, например GetVerbosity()
Как это:
package common
type Common struct {
Specificer
}
func (c *Common) Start() {
...
name := Specific.Name()
}
func (c *Common) GetVerbosity() {...}
type Specificer interface {
Name() string
Format() string
}
И определенную часть:
package specific1
// should implement common.Specificer interface
type Specific1 struct {
// unexported fields
}
func (s *Specific1) Name() string {...}
func (s *Specific1) Format() string {
// How to call it???
Common.Method()
}
Это похоже на некоторые фреймворки - когда другой код вызывает ваш код, а также вы называете его кодом.
Как реализовать это лучше?А как создавать новые структуры?Я пробовал:
Встраивать Specific
в Common
и вставлять наоборот:
type Common struct {
Specificer
}
type Specific1 struct {
common.Common
...
}
// But this is little bit insane:
func NewSpecific1() *common.Common {
var s = Specific1{}
return &common.Common{Specificer: &s}
}
Определить 2 интерфейса: Commoner
и Specificer
.И комбинированный интерфейс:
package common
type CommonSpecificer interface {
Commoner
Specificer
}
type Common struct {...} // implements all the methods from Commoner
func New() *Common {...}
//////
package specific1
type Specific1 struct { // implements all the methods from common.Specificer
Common
...
}
func NewSpecific1() *Specific1 {
c := common.NewCommon(...)
s := &Specific1{Common: c}
return s
}