go里面的继承实现,父类类型做为函数入参,怎么传子类作为参数

lnktoking · 2023-08-31 17:53:35 · 2216 次点击

你这个接近我描述需要的要求,但我实际要实现逻辑要复杂一点,这里只是简化了。实际具体的任务逻辑还有几个函数要实现的,例如前置后置通知,异常通知等,你这样实现每个任务的执行方法都要重复这个代码逻辑,我大概要实现10来个任务,还是会有很多冗余代码,不过还是感谢回复

#3
更多评论
yzbzg
golang/c#/cs/h5

或许这么写可以满足你的想法(公共逻辑可以绑定到父结构体Task上)

package main

import ( "log" "time" )

type Task struct { TaskExec Status int Name string StratTime int64 EndTime int64 }

func (t Task) start() { // 修改任务状态为执行中 t.Status = 1 // 记录任务开始执行时间 t.StratTime = time.Now().Unix() // 这里还会有很共性逻辑处理被省略掉了

}

func (t Task) end() { // 修改任务状态为执行结束 t.Status = 2 // 记录任务执行结束时间 t.EndTime = time.Now().Unix() }

type TaskExec interface { exec() }

type TaskA struct { Task ParamA string }

type TaskB struct { Task ParamA string }

func (a TaskA) exec() { // 执行任务A的逻辑 a.start() //A特有逻辑 log.Println("A特有逻辑") a.end()

}

func (b TaskB) exec() {

b.start()
//B特有逻辑
log.Println("B特有逻辑")
b.end()

}

// 执行任务,问题点在入参这里,这样写入参就只能是Task,不能传TaskA和TaskB, // 用go有什么办法可以实现像java一样传子类做为入参 func Exec(task TaskExec) {

// 这里也是还会有很共性逻辑处理被省略掉了
//具体逻辑
task.exec()

}

func main() { ta := TaskA{} tb := TaskB{}

// 这里要怎么才能传子类到函数里面执行????
Exec(&ta)
Exec(&tb)

}

#1

你看这样会不会好点, Task 作为执行者,实际 exec 可以根据需求设置为实现 TaskExec 的对象。


type Task struct {
    exec      TaskExec
    Status    int
    Name      string
    StartTime int64
    EndTime   int64
}

func NewTask(exec TaskExec) *Task {
    return &Task{
        exec: exec,
    }
}

type TaskExec interface {
    exec()
}

type TaskA struct {
    ParamA string
}

type TaskB struct {
    ParamA string
}

func (TaskA) exec() {
    // 执行任务A的逻辑
}

func (TaskB) exec() {
    // 执行任务B的逻辑
}

// 执行任务,问题点在入参这里,这样写入参就只能是Task,不能传TaskA和TaskB,
// 用go有什么办法可以实现像java一样传子类做为入参
func (t *Task) Exec() {
    // 修改任务状态为执行中
    t.Status = 1
    // 记录任务开始执行时间
    t.StartTime = time.Now().Unix()
    // 这里还会有很共性逻辑处理被省略掉了

    // 执行具体任务的逻辑
    t.exec.exec()
    // 修改任务状态为执行结束
    t.Status = 2
    // 记录任务执行结束时间
    t.EndTime = time.Now().Unix()
    // 这里也是还会有很共性逻辑处理被省略掉了
}

func main() {
    ta := NewTask(&TaskA{})
    tb := NewTask(&TaskB{})

    // 这里要怎么才能传子类到函数里面执行????
    ta.Exec()
    tb.Exec()
}
#2