Информация об изменениях

Сообщение Re: ООП не получается [Решено] от 28.06.2023 7:25

Изменено 28.06.2023 8:16 Doom100500

Re: ООП не получается
Всё, придумал.

Если нет 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, то эмулируем и её при помощи передачи функции коллбэка в "базу":

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

По большому счёту шило на мыло, но так моему внутреннему перфекционисту стало немного лучше.