У меня есть приложение с несколькими одновременными реализациями одного и того же API (например, одна поддерживается базой данных SQL, а другая - набором данных, хранящимся в файле XML). Что я действительно хотел бы сделать, так это определить родительский тип для каждого типа вещей в API, который
содержит переменные-члены, общие для всех реализаций, и
определяет методы, которые должны быть во всех реализациях.
Итак, в (недействительном) Go я хочу сделать что-то вроде:
type Person interface {
Name string
Title string
Position string
Boss() *Person
}
type Person_XML struct {
Person
}
func (p *Person_XML) Boss() (*Person, error) {
// Poke around an XML document and answer the question
return boss, nil
}
type Person_SQL {
Person
}
func (p *Person_SQL) Boss() (*Person, error) {
// Do a DB query and construct the record for the boss
return boss, nil
}
Но, конечно, это незаконно, поскольку только структуры имеют переменные-члены и только интерфейсы имеют функции-члены. Я мог бы сделать это только с такими интерфейсами:
type Person interface {
Name() string
Title() string
Position() string
Boss() Person
}
type Person_XML struct {
NameValue string
TitleValue string
PositionValue string
Person
}
func (p *Person_XML) Name() string {
return p.NameValue
}
func (p *Person_XML) Title() string {
return p.TitleValue
}
func (p *Person_XML) Position() string {
return p.PositionValue
}
func (p *Person_XML) Boss() (Person, error) {
// Poke around an XML document and answer the question
return boss, nil
}
и аналогично для других реализаций. Есть ли альтернатива, которая не заставляет меня превращать переменные-члены в функции-члены? Какова наилучшая практика для такого варианта использования?