Как создать расширенный тип - PullRequest
0 голосов
/ 18 сентября 2018

Я вижу, что можно расширять импортированные пакеты, например, для добавления новых методов.

Однако я пытаюсь создать новый экземпляр моей собственной структуры:

package main

import (
    "github.com/intdxdt/rtree"
)

type RTree struct {
    rtree.RTree
}

func NewRTree(nodeCap ...int) *RTree {
    return rtree.NewRTree(nodeCap...)
}

Подобный пример я видел у другого вопроса.Но я получаю сообщение об ошибке: не может использовать rtree.NewRTree (nodeCap ...) (тип * rtree.RTree) в качестве типа * RTree в возвращаемом аргументе .

Вопрос - как сделатьЯ инициализирую и использую свою собственную структуру со своими собственными методами и со всеми импортированными методами / полями, включенными?

1 Ответ

0 голосов
/ 18 сентября 2018

Всегда помните, 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 напрямую?Составляя его, вы получите все методы вложенного типа, но вы не можете передать его любой функции, которая ожидает включающий тип.Хорошая новость заключается в том, что вы неявно удовлетворяете интерфейсы, которым удовлетворяет включающий тип, и, следовательно, вы можете передавать его функциям, которые принимают эти интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...