Встраивание взаимозависимых структур / интерфейсов - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть 3 структуры, которые похожи примерно на 70%.Поэтому я хотел бы извлечь некоторую общую часть и создать некоторые расширения с конкретными методами и полями.

Окончательная структура будет работать следующим образом:

  1. метод .Start() изCommon называется

  2. Start() вызывает метод .Name() из определенной части, последняя возвращает строку

  3. возвращаемый результатобрабатывается в (*Common).Process(), иногда он должен вызывать определенные Format()

  4. Но!Определенная часть должна вызывать метод Общей части, например 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() 
}

Это похоже на некоторые фреймворки - когда другой код вызывает ваш код, а также вы называете его кодом.

Как реализовать это лучше?А как создавать новые структуры?Я пробовал:

  1. Встраивать 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. Определить 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
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...