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

时间:2012-10-13 17:24:09

标签: java inheritance abstract

这段代码不是我的,我需要添加一些改进,但我遇到了这个问题。

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

提前感谢!!!

4 个答案:

答案 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;
}

请将此方法设为abstractAbstract

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;
    }
    ...
}