自问自答一下,思考一下,基类中需要调用子类的方法,那么是否可以让基类持有一个指向子类的指针?换成 go 里面,在基类中定义一个接口,这个接口用于指向某一个实现该接口的子类实例。


  • 在基类中定义指向子类对象的接口成员
type SortStruct struct {
	Number      int
	ToSortSlice []int
	SortedSlice []int
	T1          int64
	T2          int64
	sorter      SortInterface // 接口对象
}


  • 通过接口成员的方法直接调用接口所指实例实现的方法
func (sortStruct *SortStruct) Run() {
	fmt.Println("to sort slice:", sortStruct.ToSortSlice)
	sortStruct.T1 = time.Now().UnixNano()
	// sortStruct.
	// sort()
	// 如何不传递函数直接调用不同子类方法

	sortStruct.sorter.Sort() // 直接调用具体子类实现的方法

	sortStruct.T2 = time.Now().UnixNano()
	fmt.Println("sorted slice:", sortStruct.SortedSlice)
	fmt.Println("using time:", sortStruct.T2-sortStruct.T1, "Nanosecond")
}


  • 再想办法将子类绑定到这个接口成员上,通过基类 Init 方法
func (sortStruct *SortStruct) Init(number int, sorter SortInterface) {
	rand.Seed(time.Now().Unix())
	sortStruct.Number = number

	sortStruct.sorter = sorter // 绑定

	sortStruct.ToSortSlice = make([]int, 0, number)
	for index := 0; index != number; index++ {
		sortStruct.ToSortSlice = append(sortStruct.ToSortSlice, rand.Intn(number))
	}
	sortStruct.SortedSlice = make([]int, 0, number)
}


  • 主函数调用
const number int = 10

func init() {
	insertionSort = &InsertionSort{}
	insertionSort.sortStruct.Init(number, insertionSort)

	mergeSort = &MergeSort{}
	mergeSort.sortStruct.Init(number, mergeSort)
}

func main() {
	insertionSort.sortStruct.Run()
	mergeSort.sortStruct.Run()
}


这样子类的关系是:子类组合基类,基类持有一个指向子类实例的接口

好像有点循环引用的意思,不知道这样做可不可以,但确实是实现了我想要的功能

有没有其他做法,还请指教