Сообщение Re: ООП не получается [Решено] от 28.06.2023 7:25
Изменено 28.06.2023 8:16 Doom100500
Re: ООП не получается
Всё, придумал.
Если нет vtable, то эмулируем и её при помощи передачи функции коллбэка в "базу":
https://go.dev/play/p/e6lAjK9hPwx
По большому счёту шило на мыло, но так моему внутреннему перфекционисту стало немного лучше.
Если нет vtable, то эмулируем и её при помощи передачи функции коллбэка в "базу":
package main
import "log"
type Behavor interface {
CheckCondition() bool
DoAction()
}
type defaultBefavior struct {
checkCondition func() bool // Покоцанная эмуляция vtable
}
func (b *defaultBefavior) DoAction() {
if !b.checkCondition() { //Дёрнуть наследника через callback
return
}
// Do actual action
// Общий код для всех наследников
}
type stupidBehavior struct {
*defaultBefavior
}
func (b *stupidBehavior) CheckCondition() bool {
//Проверяем внутреннее состояние - разное для всех наследников
// и, в соответсвии с этим, возвращаем результат
log.Println("stupidBefaior CheckCondition")
return true
}
func NewStupidBehavior() Behavor {
b := &stupidBehavior{
defaultBefavior: &defaultBefavior{},
}
b.defaultBefavior.checkCondition = b.CheckCondition // Но пришлось усложнить конструктор
return b
}
func main() {
st := NewStupidBehavior()
st.DoAction()
}https://go.dev/play/p/e6lAjK9hPwx
По большому счёту шило на мыло, но так моему внутреннему перфекционисту стало немного лучше.
Re: ООП не получается [Решено]
Всё, придумал.
Если нет vtable, то эмулируем и её при помощи передачи функции коллбэка в "базу":
https://go.dev/play/p/e6lAjK9hPwx
По большому счёту шило на мыло, но так моему внутреннему перфекционисту стало немного лучше.
Если нет vtable, то эмулируем и её при помощи передачи функции коллбэка в "базу":
package main
import "log"
type Behavor interface {
CheckCondition() bool
DoAction()
}
type defaultBefavior struct {
checkCondition func() bool // Покоцанная эмуляция vtable
}
func (b *defaultBefavior) DoAction() {
if !b.checkCondition() { //Дёрнуть наследника через callback
return
}
// Do actual action
// Общий код для всех наследников
}
type stupidBehavior struct {
*defaultBefavior
}
func (b *stupidBehavior) CheckCondition() bool {
//Проверяем внутреннее состояние - разное для всех наследников
// и, в соответсвии с этим, возвращаем результат
log.Println("stupidBefaior CheckCondition")
return true
}
func NewStupidBehavior() Behavor {
b := &stupidBehavior{
defaultBefavior: &defaultBefavior{},
}
b.defaultBefavior.checkCondition = b.CheckCondition // Но пришлось усложнить конструктор
return b
}
func main() {
st := NewStupidBehavior()
st.DoAction()
}https://go.dev/play/p/e6lAjK9hPwx
По большому счёту шило на мыло, но так моему внутреннему перфекционисту стало немного лучше.