从Golang的父级实现方法中调用子级方法

Felipe Rocha:

我正在尝试实现一个行为树,并且在其组成功能方面苦苦挣扎。基本上,我需要Tick()在下面实现以调用由嵌入位置定义的方法。

这里是behavior.go

type IBehavior interface {
  Tick() Status
  Update() Status
}

type Behavior struct {
  Status Status
}

func (n *Behavior) Tick() Status {
  fmt.Println("ticking!")
  if n.Status != RUNNING { n.Initialize() }
  status := n.Update()
  if n.Status != RUNNING { n.Terminate(status) }

  return status
}

func (n *Behavior) Update() Status {
  fmt.Println("This update is being called")
  return n.Status
}

这是Behavior嵌入结构:

type IBehaviorTree interface {
  IBehavior
}

type BehaviorTree struct {
  Behavior

  Root IBehavior
}

func (n *BehaviorTree) Update() Status {
  fmt.Printf("Tree tick! %#v\n", n.Root)
  return n.Root.Tick()
}

使该示例更有意义的一些文件:

type ILeaf interface {
  IBehavior
}

type Leaf struct {
  Behavior
}

还有这个:

type Test struct {
  Leaf

  Status Status
}

func NewTest() *Test {
    return &Test{}
}

func (n Test) Update() Status {
    fmt.Println("Testing!")
    return SUCCESS
}

这是其用法示例:

tree := ai.NewBehaviorTree()
test := ai.NewTest()
tree.Root = test

tree.Tick()

我期望通过打印以下内容使树正常打勾:

ticking!
Tree tick!

但是相反,我得到了:

ticking!
This update is being called

有人可以帮我解决这个问题吗?

编辑:添加了一些额外的文件来阐明问题。另外,我不理解反对意见。我有一个老实的问题。我是否只应该问已经对我有意义的问题?

承保范围:

您的问题Tick()是未在BehaviorTree结构上定义。结果,当您调用时tree.Tick(),没有定义直接方法,因此它将调用Tick()嵌入式Behavior结构的提升方法Behavior结构不知道a BehaviorTree什么在Go的伪继承嵌入样式中,“子”类型没有“父”的概念,也没有引用或访问它们的方式。嵌入式方法是使用嵌入式类型作为其接收方而不是嵌入式结构来调用的

如果希望获得预期的行为,则需要Tick()BehaviorTree类型定义一个方法,并让该方法调用其自己的Update()方法(然后根据需要调用子方法Tick()Update()方法)。例如:

type BehaviorTree struct {
  Behavior

  Root IBehavior
}

func (n *BehaviorTree) Tick() Status {
    n.Update() // TODO: do you want this status or the Root.Tick() status?
    return n.Root.Tick()
}

func (n *BehaviorTree) Update() Status {
  fmt.Printf("Tree tick! %#v\n", n.Root)
  return nil
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法在子级React Native中调用父级的方法

使用父实例在父级中调用子方法类

Flutter-在父级的某些子级上调用方法

在子级中调用抽象方法时填写父级变量

子级父级中的Angular2模态调用方法

在Angular的父级模板中调用子级组件的方法是一种好习惯吗?

JavaScript中的继承:调用父级的方法

在父级中定义的方法中访问父级和子级变量-PHP

从父级调用子级方法

从父级调用子级方法

停止单击父级上的子调用方法 - React/JavaScript

ReactJS-在父级中获取子级元素并循环执行每个子级的方法

从使用 react native 中的 map 函数渲染的组件的父级调用子方法

在父级中调用函数并将`this`绑定到子级?

如何在多级继承中调用父级方法

在ReactJS中从子级调用父类方法

从 <view> 数组中每个孩子的父级调用方法

在子组件中访问父级内容或更好的方法

在父级中单击时在父级中调用子级元素

在 Blazor 中从子组件调用父级渲染,因此父级包含子级

当方法不属于父级原型时,是否可以从子级调用父级方法?

如何从子级调用父级私有方法?

调用父级活动方法-BLE

Rails的“ where”方法按子级属性查找父级

通过子级按钮更新父级状态的正确方法

PHPUnit-在子级中实现抽象方法

当子级在JavaScript中具有相同名称的方法时,如何调用父级的方法?像Java中的类型转换一样吗?

如何从父级的静态方法调用子级的静态方法?

嵌套在Quasar中路由器中的子级的父级触发方法(vue)