我理解为什么下面这段代码不起作用。这是因为卷积会调用 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;
}
}
}
然后,有没有可行的方法呢?
答案 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();
}