go的函数重写问题

GO语言函数继承重写之后还是执行了父类的函数

package main
import (
    "fmt"//基础任务类
type BaseTask struct {


}

//注册
func(t* BaseTask) Register(data *[]byte){
    fmt.Println("This is basetask")
}

//登录
func(t* BaseTask) Login(data *[]byte) {


}

//解析
func(t* BaseTask) Do(d int){
    switch d {
        case 0:
            t.Register(con,c)
            break
        case 1:
            t.Login(con,c)
            break
        }
}


//继承BaseTask
type Principal struct {

    BaseTask
}


//重写注册函数注册
func (t* Principal)Register(data *[]byte) {

    fmt.Print("this is Principal")

}

//重写登录函数
func (t* Principal) Login(data *[]byte) {

}

func main(){

    c:=new(Principal)
    c.do(0)
}

看了下网上的文章,都没有这种写法,请问下go是不支持吗?还有其他写法能做到我想要的效果吗?

go
最佳答案

那可以用go的interfaceDo函数接收的是一个interface这个interface注册registerLogin函数,然后调用Do的时候传的是哪一个实例就会调用谁的函数,如下:

// 定义接口
type abc interface {
    Register()
    Login()
}

type a struct {

}

func (c *a) Register(){
    fmt.Println("a register")
}

type b struct {

}

func (c *b) Register(){
    fmt.Println("b register")
}
// 创建函数,接收类型为abc接口
func Do(d abc)  {
    d.Register()
}
// main使用
a := new(a)
Do(a)
b := new(b)
Do(b)
3年前 评论
tiantianaixuexi (楼主) 3年前
讨论数量: 3

你得把你得Do函数改成

func(t* Principal) Do(d int){
    switch d {
        case 0:
            t.Register(con,c)
            break
        case 1:
            t.Login(con,c)
            break
        }
}

父类只有2个函数,子类调用DoDo里面调用RegisterLogin,此时的RegisterLogin是先找子类的,如果子类没有,则去找父类的。

3年前 评论
tiantianaixuexi (楼主) 3年前

那可以用go的interfaceDo函数接收的是一个interface这个interface注册registerLogin函数,然后调用Do的时候传的是哪一个实例就会调用谁的函数,如下:

// 定义接口
type abc interface {
    Register()
    Login()
}

type a struct {

}

func (c *a) Register(){
    fmt.Println("a register")
}

type b struct {

}

func (c *b) Register(){
    fmt.Println("b register")
}
// 创建函数,接收类型为abc接口
func Do(d abc)  {
    d.Register()
}
// main使用
a := new(a)
Do(a)
b := new(b)
Do(b)
3年前 评论
tiantianaixuexi (楼主) 3年前

你子类不重写do函数怎么调用

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!