从面向对象的角度上看,总会有一些使用子类不想做,希望父类去做的事情,在java这样的纯面向对象的语言中,方法就是使用父类和子类,子类通过继承父类的方法,实现子类自己的属性,如果没有某个方法没有经过子类重写,那么这个方法通过子类调用时,就会调用父类的方法。

在go中也有这样的机制。下面是具体的实现代码。

简单的说就子类能够按照父类的方法框架来设计,同时父类还把一些子类自身的个性化的方法进行了抽象,抽象成golang中的接口,通过实现接口实现了在指定的方法上调用子类或者父类(取决于子类是否重新实现了方法),

好,下面上货。

package demo

import (
	"fmt"
	"testing"
)

type IChildHandle interface {
	AddAge()
	HandleAfterInit(handler IChildHandle)
}

type Base struct {
	name string
	age  int
}

func (b *Base) AddAge() {
	fmt.Println("base add Age .....")
}

func (b *Base) reName() {
	fmt.Println("rename ing...")
}

func (b *Base) HandleAfterInit(handler IChildHandle) {
	fmt.Printf("before save base obj name:%s,age:%d\r\n", b.name, b.age)
	b.name = b.name + "aaaaa"
	handler.AddAge()
	fmt.Printf("real save base obj name:%s,age:%d\r\n", b.name, b.age)
}

type Child1 struct {
	*Base
	price int
}

func (c *Child1) AddAge() {
	fmt.Println("child add age ...")
	c.age += 2
}

func TestDuoTai(t *testing.T) {
	b := &Base{
		name: "base xx",
		age:  100,
	}
	c := &Child1{
		Base:  b,
		price: 333,
	}
	b.HandleAfterInit(c)
	c.AddAge()
	c.reName()
	fmt.Println(c.age)
}

运行结果如下:

=== RUN   TestDuoTai
before save base obj name:base xx,age:100
child add age ...
real save base obj name:base xxaaaaa,age:102
child add age ...
rename ing...
104
--- PASS: TestDuoTai (0.00s)
PASS

 

上面的代码说明了在go中如果使用父子继承关系的类,同时也说明了在子类中自定义个性化的方法的同时,如何与父类进行关联。总结的说就是golang 的面向对象是如何具体编码实现的。