0

以下是我认为这两个类的代码的相关部分。首先,TreePointer(原始来源在这里):

public abstract class TreePointer<T extends TreeNode>
    implements Iterable<TokenResolver<T>>
{
    //...

    /**
     * What this tree can see as a missing node (may be {@code null})
     */
    private final T missing;

    /**
     * The list of token resolvers
     */
    protected final List<TokenResolver<T>> tokenResolvers;

    /**
     * Main protected constructor
     *
     * <p>This constructor makes an immutable copy of the list it receives as
     * an argument.</p>
     *
     * @param missing the representation of a missing node (may be null)
     * @param tokenResolvers the list of reference token resolvers
     */
    protected TreePointer(final T missing,
        final List<TokenResolver<T>> tokenResolvers)
    {
        this.missing = missing;
        this.tokenResolvers = ImmutableList.copyOf(tokenResolvers);
    }

    /**
     * Alternate constructor
     *
     * <p>This is the same as calling {@link #TreePointer(TreeNode, List)} with
     * {@code null} as the missing node.</p>
     *
     * @param tokenResolvers the list of token resolvers
     */
    protected TreePointer(final List<TokenResolver<T>> tokenResolvers)
    {
        this(null, tokenResolvers);
    }

    //...

    /**
     * Tell whether this pointer is empty
     *
     * @return true if the reference token list is empty
     */
    public final boolean isEmpty()
    {
        return tokenResolvers.isEmpty();
    }

    // .iterator(), .equals(), .hashCode(), .toString() follow
}

然后,JsonPointer其中包含.parent()我想在此处分解的此方法(此处为原始来源

public final class JsonPointer
    extends TreePointer<JsonNode>
{
    /**
     * The empty JSON Pointer
     */
    private static final JsonPointer EMPTY
        = new JsonPointer(ImmutableList.<TokenResolver<JsonNode>>of());

    /**
     * Return an empty JSON Pointer
     *
     * @return an empty, statically allocated JSON Pointer
     */
    public static JsonPointer empty()
    {
        return EMPTY;
    }

    //...

    /**
     * Return the immediate parent of this JSON Pointer
     *
     * <p>The parent of the empty pointer is itself.</p>
     *
     * @return a new JSON Pointer representing the parent of the current one
     */
    public JsonPointer parent()
    {
        final int size = tokenResolvers.size();
        return size <= 1 ? EMPTY
            : new JsonPointer(tokenResolvers.subList(0, size - 1));
    }

    // ...
}

如主题中所述,我在这里遇到的问题是JsonPointer'.parent()方法。事实上,这种方法背后的逻辑适用于所有TreeNode实现。除了我必须使用构造函数,当然这样的构造函数是依赖于实现的:/

有没有办法实现.parent(),以便每个实现都TreeNode接收一个自身的实例而不是TreeNode,或者它只是一个白日梦?

4

2 回答 2

3

当然,您可以向超类添加abstract方法。真正的问题是,这有意义吗?我们这里没有足够的上下文来判断它是否有意义。parentTreePointer

如果它对所有情况都有意义TreePointer,那么继续添加一个abstract方法parentTreePointer在所有子类中添加一个具体实现。或者,您可以将默认实现放入TreePointer并在您希望在子类中提供不同行为的地方覆盖它。


另外,我如何确保对于 TreeNode 的实现 X,返回类型是 X 而不是 TreeNode?那是我的问题,最终。

TreePointer课堂上,您只需创建一个方法public TreePointer<T> parent()。您应该能够在那里使所有代码通用,除了new new JsonPointer(...)部分。您可能必须将其重构为一个单独的方法(可能protected),您可以在每个具体子类中覆盖该方法。


由于您想返回JsonPointer而不是TreePointer<T>在子类中,并且您还存在需要(非静态)工厂方法的问题,我认为您最初的怀疑是非常正确的。您可以使用父类中的抽象实现来完成这项工作,但您需要覆盖它以在子类中提供更具体的返回类型,我认为这不值得。只需声明一个public abstract TreePointer<T> parent()in并用inTreePointer覆盖它。public JsonPointer parent()JsonPointer

于 2013-06-29T16:38:43.057 回答
1

您可以在 JsonPointer 上创建工厂方法,这样您就不必使用构造函数并且可以独立于实现。

于 2013-06-29T16:25:58.650 回答