从面向对象的角度上看,总会有一些使用子类不想做,希望父类去做的事情,在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 的面向对象是如何具体编码实现的。