Java从抽象类访问子类方法/变量
这段代码不是我的,我需要对它进行一些改进,但我陷入了这个问题 我有一个抽象类“CallNode”和许多子类,其中一个是“Call”。“Checker”类正在拦截未接呼叫,但将其作为CallNode返回。我的问题是我需要获取这个调用的id,但我不能通过CallNode访问它 你对解决这个问题有什么建议吗 我将向您提供代码,以便您更好地理解问题:Java从抽象类访问子类方法/变量,java,inheritance,abstract,Java,Inheritance,Abstract,这段代码不是我的,我需要对它进行一些改进,但我陷入了这个问题 我有一个抽象类“CallNode”和许多子类,其中一个是“Call”。“Checker”类正在拦截未接呼叫,但将其作为CallNode返回。我的问题是我需要获取这个调用的id,但我不能通过CallNode访问它 你对解决这个问题有什么建议吗 我将向您提供代码,以便您更好地理解问题: public abstract class CallNode { public abstract CallNode hasMissingCall(
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!!!
}
提前谢谢你 您应该
不要直接访问您的字段
一般来说,字段
应该声明为私有
,并且您应该有公共访问器
方法来访问它们
如果可以修改类,则在抽象调用节点
类和调用
类中添加一个方法getId()
。在Call类中,让此方法返回您的this.id
。这将为你做这项工作
因此,将此方法添加到您的调用
类:-
public int getId() {
return this.id;
}
在abstract
类中,将此方法设置为abstract
public abstract class CallNode {
public abstract CallNode hasMissingCall();
public abstract int getId();
}
并使用以下命令调用它:-
missing.getId();
这将调用调用
类的getId()
public abstract class CallNode {
public abstract CallNode hasMissingCall();
public abstract int getId();
}
这段代码不是我的,我需要对它进行一些改进
PS:-您真正需要添加的一个改进是,将hasMissingCall
更改为getMissingCall
,因为它会返回一个未接来电。始终遵循代码中的命名约定。
记住,你不是为自己编写代码,而是为他人编写代码以供使用和维护。你可以归结为调用
:
System.out.println( ((Call) missing).id );
如果您无法更改其他类,并且知道missing
将是Call
的一个实例,请定义一个模板方法,在抽象类中返回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字段,因为我认为它应该是唯一的,并且由所有子类共享。您可以在CallNode中指定absract方法getId(),并在子类中实现它。然后,您可以在您的检查程序中访问它
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;
}
...
}
public abstract CallNode hasMissingCall()代码>,听起来应该返回布尔值。真糟糕,谢谢你,弗拉德!但我现在正在验证,我不能保证“missing”将是“Call”的一个实例,它可以是“CallNode”的另一个子类的一个实例。我试图在很多类中避免更改,但这确实是必要的!我将把“id”字段移到“CallNode”并创建一个抽象的“getID()”。加上最后一个建议和名字Heisenbug。谢谢你的提示,Rohit。我的所有字段都声明为“private”,我给出的代码是对真实字段的简化,以便更快地识别问题。我将使用你提出的解决方案。关于方法命名法,我承认这不是最好的,但它不是我的代码。再一次,谢谢你的提示。谢谢你,安东。我将使用这种方法。