Как реализовать интерфейс с функциями с одинаковыми логами c? - PullRequest
1 голос
/ 13 апреля 2020

Я хотел бы предоставить несколько реализаций для следующего интерфейса:

type API interface {
    A()
    B()
    C()
}

В соответствии с моими вариантами использования все реализации должны иметь одинаковые логики c для функции A и B , в то время как функция C будет иметь разные логики c для разных реализаций.

Поэтому я создал следующую общую реализацию для встраивания:

type Common struct {}

func (c *Common) A() {}
func (c *Common) B() {}

Чтобы создать две реализации для интерфейса выше, я могу просто сделать следующее:

type FirstImpl struct { Common }

func (i *FirstImpl) C() {}

type SecondImpl struct { Common }

func (i *SecondImpl) C() {}

Все работает отлично, пока я не обнаружу эту функцию C должен вызываться внутри функции B . Обратите внимание, что логика c для функции B должна быть одинаковой в двух реализациях, несмотря на то, что мы можем получить разные результаты, вызывая C внутри B .

Мне интересно, является ли это распространенным шаблоном в Go и существует ли элегантный способ справиться с этим.

1 Ответ

1 голос
/ 13 апреля 2020

Вы хотите эмулировать позднюю привязку.

Один из способов достижения этого - использование указателя функции и конструкторов для реализаций:

type CommonImpl struct {
   cimpl func()
}

func (c CommonImpl) C() { c.cimpl() }

type FirstImpl struct {
   CommonImpl
}

func NewFirstImpl() APIImpl {
   ret:=FirstImpl{}
   ret.cimpl=ret.c
   return &ret
}

С помощью этой реализации вы можете вызвать производный тип C().

Альтернативой может быть передача функции в качестве аргумента:

func (c CommonImpl) C(bfunc func()) {
}

...
x:=FirstImpl{}
x.C(x.B)

Или с интерфейсом:

type BIntf interface {
   B()
}

func (c CommonImpl) C(b BIntf) {
}


x:=FirstImpl{}
x.C(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...