自问自答一下,思考一下,基类中需要调用子类的方法,那么是否可以让基类持有一个指向子类的指针?换成 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()
}
这样子类的关系是:子类组合基类,基类持有一个指向子类实例的接口
好像有点循环引用的意思,不知道这样做可不可以,但确实是实现了我想要的功能
有没有其他做法,还请指教