这段代码不是我的,我需要添加一些改进,但我遇到了这个问题。
我有一个抽象类“CallNode”和许多子类,其中一个是“Call”。 “Checker”类拦截未接来电,但将其作为CallNode返回。我的问题是我需要获取此调用的ID,但我无法通过CallNode访问它。
您有什么建议可以解决这个问题吗?
我告诉你代码,以便你能更好地理解问题:
public abstract class CallNode {
public abstract CallNode hasMissingCall();
}
public class Call extends CallNode {
public int id;
// Simplification of method
public CallNode hasMissingCall() {
if (true)
return this;
// ...
}
}
public class Checker{
private static CallNode rootExpected;
CallNode missing = rootExpected.hasMissingCall();
System.out.println( missing.id ); // THE PROBLEM!!!
}
提前感谢!!!
答案 0 :(得分:3)
定义一个模板方法,在抽象类中返回id:
public abstract class CallNode {
public abstract CallNode hasMissingCall();
public abstract int getId();
}
让子类实现它:
public class Call extends CallNode {
public int id;
// Simplification of method
public CallNode hasMissingCall() {
if (true)
return this;
// ...
}
public int getId()
{
return this.id;
}
}
这是一个选择。我个人会在CallNode类中向上移动id字段,因为我认为它应该是唯一的并且由所有子类共享。
答案 1 :(得分:2)
你应该never directly access your fields
。
一般情况下,fields
应声明为private
,您应该使用public accessor
方法来访问它们。
如果您可以修改类,请在getId()
类和abstract CallNode
类中添加方法Call
。在Call类中,此方法返回this.id
。这将为你完成这项工作。
因此,请将此方法添加到Call
类: -
public int getId() {
return this.id;
}
请将此方法设为abstract
类Abstract
。
public abstract class CallNode {
public abstract CallNode hasMissingCall();
public abstract int getId();
}
使用以下方法调用它: -
missing.getId();
这会拨打getId()
班级的Call
。
此代码不是我的,我需要添加一些改进,
PS: - 您真正需要添加的一项改进是,将hasMissingCall
更改为getMissingCall
,因为它会返回missed call
。始终在代码中关注naming conventions
记住,你不是为自己编写代码,而是为其他人编写代码以供使用和维护。
答案 2 :(得分:1)
你可以投降到Call
:
System.out.println( ((Call) missing).id );
如果你不能改变其他类,如果你知道missing
将是Call
的实例。
答案 3 :(得分:0)
您可以在Call Node中指定抽象方法getId()并在子节点中实现它。然后,您可以在Checker中访问它。
public abstract class CallNode {
public abstract CallNode hasMissingCall();
public abstract int getId();
}
public class Checker{
private static CallNode rootExpected;
CallNode missing = rootExpected.hasMissingCall();
System.out.println( missing.getId() );
}
public class Call extends CallNode {
public int id; // better set private modifier
public int getId() {
return id;
}
...
}