Java从抽象类访问子类方法/变量

Java从抽象类访问子类方法/变量,java,inheritance,abstract,Java,Inheritance,Abstract,这段代码不是我的,我需要对它进行一些改进,但我陷入了这个问题 我有一个抽象类“CallNode”和许多子类,其中一个是“Call”。“Checker”类正在拦截未接呼叫,但将其作为CallNode返回。我的问题是我需要获取这个调用的id,但我不能通过CallNode访问它 你对解决这个问题有什么建议吗 我将向您提供代码,以便您更好地理解问题: public abstract class CallNode { public abstract CallNode hasMissingCall(

这段代码不是我的,我需要对它进行一些改进,但我陷入了这个问题

我有一个抽象类“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!!!
}

提前谢谢你

您应该
不要直接访问您的字段

一般来说,
字段
应该声明为
私有
,并且您应该有
公共访问器
方法来访问它们

如果可以修改类,则在
抽象调用节点
类和
调用
类中添加一个方法
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”,我给出的代码是对真实字段的简化,以便更快地识别问题。我将使用你提出的解决方案。关于方法命名法,我承认这不是最好的,但它不是我的代码。再一次,谢谢你的提示。谢谢你,安东。我将使用这种方法。