Всегда помните, Go не поддерживает inheritance
.Он поддерживает composition
.
Вы можете call
наследовать его, поскольку это помогает вам логически сопоставлять другие языки ООП, и Go.Правило большого пальца: всякий раз, когда что-то не работает так, как оно работает в OOP
мире, думайте с точки зрения композиции.
Но когда дело доходит до написания реального кода, всегда помните, что нет is a
отношение в композиции, и оно всегда has a
, даже если кажется, что это иное, из-за того, что вы можете получить доступ к переменным-членам и методам структуры composed/embedded
(все еще не наследуемой).Вы можете даже override
метод, если вы объявите то же самое с новой структурой.Вот еще один улов - вы все равно не сможете получить доступ к не выставленным (близко к protected
из Java-мира) переменным и функциям структуры в другом пакете, как это выглядит в вашем случае.
Но ваш тип RTree
has
rtree.RTree
, но никогда не будет rtree.RTree
и всегда будет другим типом для компилятора.
package main
import (
"github.com/intdxdt/rtree"
)
type RTree struct {
rtree.RTree
}
func NewRTree(nodeCap ...int) *RTree {
return &RTree{
RTree: *rtree.NewRTree(nodeCap...),
}
}
На отдельном узле,если у вас нет дополнительных параметров, почему бы не использовать rtree.RTree
напрямую?Составляя его, вы получите все методы вложенного типа, но вы не можете передать его любой функции, которая ожидает включающий тип.Хорошая новость заключается в том, что вы неявно удовлетворяете интерфейсы, которым удовлетворяет включающий тип, и, следовательно, вы можете передавать его функциям, которые принимают эти интерфейсы.