Я хотел бы предоставить несколько реализаций для следующего интерфейса:
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 и существует ли элегантный способ справиться с этим.