type BaseUser struct {
id int64
name string
}
type WorkingUser struct {
BaseUser
WorkingHours string
}
type SlackingUser struct {
BaseUser
TimeOfSlacking time.Duration
}
func newBaseUser(id int64, name string) BaseUser {
// Тут какая-то общая логика для создания любого пользователя
return BaseUser{
id: id,
name: name,
}
}
func NewWorkingUser(id int64, name string, workingHours string) *WorkingUser {
// Тут добавочная логика создания для рабочего
return &WorkingUser{
BaseUser: newBaseUser(id, name),
WorkingHours: workingHours,
}
}
func NewSlackingUser(id int64, name string, timeOfSlacking time.Duration) *SlackingUser {
// Тут добавочная логика для создания лентяя
return &SlackingUser{
BaseUser: newBaseUser(id, name),
TimeOfSlacking: timeOfSlacking,
}
}
func (b BaseUser) GetName() string {
// Какая-то работа с данными, которая одинакова для всех
return b.name
}
func (b BaseUser) GetDescr() string {
// Какая-то работа с данными, для которой нужна базовая реализация,
// но для некоторых пользователей она может быть другой
return "a base user with the name " + b.name
}
func (u *WorkingUser) GetDescr() string {
// Если хотим переопределить базовую реализацию для этого типа пользователя
return fmt.Sprintf("working user with hours %s", u.WorkingHours)
}
type Doer interface {
GetName() string
GetDescr() string
}
func Do(user Doer) {
// Какие-то действия с пользователем, которые используют и ту и другую логику
fmt.Println(user.GetName(), "can be described as", user.GetDescr())
}
func main() {
user1 := NewWorkingUser(1, "Ivan", "from 5 to 19")
user2 := NewSlackingUser(2, "Peter", time.Hour*2)
Do(user1)
Do(user2)
}
метод Do придется писать в каждом типе пользователя
go mod tidy
, что пишет?