0

我有一个具体的问题,比如说,我有

public interface A {
}

//------------------------------

public class B implements A {

    static int countx = 0;
}

//----------------------------------
public class C implements A {

    static int county = 0;
}

//----------------------------------

public class Arc {

    public A from;
    public A to;

//========================================

现在我有一个对象 a (它是 Arc 的一个实例),我想知道它是 B 还是 C 的一个实例,并得到属性 countX 或 countY (stg like a.from.countX)有什么想法吗?:)

4

6 回答 6

1

我认为您可以使用 instanceof 来解决此问题

如在

if(a instanceof B) return a.countx
if(a instanceof C) return a.county
于 2012-04-14T16:58:08.833 回答
1

使用instanceof和类型转换:

if (a.from instanceof B) {
    B b = (B)a.from;
    b.countx;
}

编辑:但你真的不需要这样的东西!如果你这样做了,你可能可以重新设计它以不产生像这样丑陋的代码。

例如,您可以让您的接口A有一个方法getCount(),并让您的类 B 和 C 实现这些,方法是返回countxor county

Edit2:我刚刚注意到您countxcounty成员是static!为什么要这么做?static意味着,它们不会“作用”于您的类的实例,而是作用于您的类对象(它们是“类成员”)。这意味着您可以在任何地方访问和修改这些变量,方法是通过A.countx或访问它们B.county;你很可能不想要这个,因为类的多个实例A共享相同的countx

于 2012-04-14T16:59:03.700 回答
1

从 OOP 的角度来看,您当前的设计并不好。你需要一些封装和多态性。在 OOP 语言中,您无需显式检查对象的类型,而是通过动态分派自动安排检查对象的类型。因此,无论您需要来自 B 和 C 的任何数据,都向接口 A 添加一个方法,该方法将获取该数据,然后相应地在 B 和 C 中实现该方法。另外,不要使用公共实例字段,这会破坏封装。

于 2012-04-14T16:59:27.690 回答
0

如果你有一个对象是 Arc 的实例,那么它怎么也是 B 或 C 的实例?我觉得你的代码有缺陷,需要重组。例如,正如 Tudor 所指出的,“你的层次结构中的类 Arc 和 A 之间没有关系。”

于 2012-04-14T16:58:29.633 回答
0

如果您只是想了解有关课程的信息:

getClass().getSuperclass()

问候, 厄瓦尔德

于 2012-04-14T17:16:13.673 回答
0

这样想:

是什么让我想区分 B 和 C ? 是手术吗?如果是这样,只需在 B 和 C 中适当地实现这些操作,然后让动态调度处理其余的事情。

interface Operation { 
    public Result operate(String[] args);
}

class A implements Operation { 

    @Override
    public Result operate(String[] args) { 
        //I need to do some special calculations for an A...           
        for(String arg : args) { 

        }
        .
        .
        .
    }
}

class B implements Operation { 

    @Override
    public Result operate(String[] args) { 
        //i know this does nothing so return the empty result
        return Result.EMPTY;
    }
}

抵制使用的诱惑instanceof。在大多数情况下,您不需要它——而且它不是面向对象的。

于 2012-04-14T17:25:15.237 回答