带继承的Java自引用

时间:2014-12-22 11:11:54

标签: java inheritance design-patterns field self-reference

我理解为什么下面这段代码不起作用。这是因为卷积会调用 Base ,而不是 Derived 。这段代码非常简单,并且具有自引用功能。我扩展了自我引用课程'我坚持这个问题。

class Base
{
    public    int  important_data;
    protected Base child;

    public int sum()
    {
        if(child != null)
        {
            return important_data + child.sum();
        }
        else
        {
            return important_data;
        }
    }
}

class Derived extends Base
{
    public int more_important;

    public int convolusion()
    {
        if(child != null)
        {
            return more_important*important_data + child.convolusion();
        }
        else
        {
            return more_important*important_data;
        }
    }
}

然后,有没有可行的方法呢?

3 个答案:

答案 0 :(得分:2)

或者,您可以使用通用基类:

class Base<T extends Base> {
    private T child;
    private int importantData;

    Base(T child) {
        this.child = child;
    }

    Base() {
        this(null);
    }

    public int sum() {
        if (child != null && child != this) {
            return importantData + child.sum();
        } else {
            return importantData;
        }
    }

    protected T child() {
        return child;
    }

    protected int importantData() {
        return importantData;
    }
}

class Derived extends Base<Derived> {
    private int moreImportant;

    public int convolusion() {
        if (child() != null && child() != this) {
            return moreImportant * importantData() + child().convolusion();
        } else {
            return moreImportant * importantData();
        }
    }
}

通过这种方式,您可以进行类型安全处理,无需进行铸造。

答案 1 :(得分:1)

您没有显示初始化child成员的位置。要致电child.convolusion(),您必须确保child的类型为Derived,并将其投放到Derived

public int convolusion()
{
    if(child != null && child instanceof Derived)
    {
        Derived d = (Derived) child;
        return more_important*important_data + d.convolusion();
    }
    else
    {
        return more_important*important_data;
    }
}

答案 2 :(得分:0)

您可以确保孩子的类型,尝试类似:

if(child != null && child instanceof Derived)
{
    return more_important * important_data + ((Derived)child).convolusion();
}