2

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

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

4 回答 4

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 字段向上移动,因为我认为它应该是唯一的并且由所有子类共享。

于 2012-10-13T17:31:17.640 回答
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:-您真正需要添加的一项改进是,将 更改hasMissingCallgetMissingCall返回给您的missed call. 始终遵循naming conventions您的代码。
请记住,您不是为自己编写代码,而是为其他人使用和维护而编写代码。

于 2012-10-13T17:26:07.970 回答
1

你可以降级为Call

System.out.println( ((Call) missing).id );

那是如果您不能更改其他类,并且如果您知道missing将是Call.

于 2012-10-13T17:26:30.613 回答
0

您可以在 CallNode 中指定抽象方法 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;
    }
    ...
}
于 2012-10-13T17:34:20.660 回答