java - 找出实现其他类的类的类型

时间:2012-04-14 16:55:40

标签: java class instance

我有一个特定的问题,比方说,我有

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的实例并获取atributes countX或countY(stg就像a.from.countX) 有任何想法吗? :)

6 个答案:

答案 0 :(得分:1)

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

,如

if(a instanceof B) return a.countx
if(a instanceof C) return a.county

答案 1 :(得分:1)

使用instanceof和类型转换:

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

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

例如,您可以让界面A拥有方法getCount(),并让您的班级B和C通过返回countxcounty来实现这些方法。

Edit2:我刚注意到您的countxcounty成员是static!为什么要这么做? static意味着,他们不会对您的班级实例“行动”,而是对您的班级对象(他们是“班级成员”)。这意味着您可以通过A.countxB.county访问到处来访问和修改这些变量。您很可能不希望这样,因为类A的多个实例将共享相同的countx

答案 2 :(得分:1)

从OOP的角度来看,您当前的设计并不好。你需要一些封装和多态。在OOP语言中,您没有明确检查了解对象的类型,您可以通过动态调度自动安排该对象。因此,无论您需要来自B和C的任何数据,都要向接口A添加一个方法,该方法将获取该数据,然后相应地在B和C中实现该方法。另外,不要使用公开实例字段来打破包容。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您只想获得有关课程的信息:

getClass().getSuperclass()

此致 Erwald

答案 5 :(得分:0)

这样想:

是什么让我想区分B和C?这是一个操作吗?如果是这样,只需在B vs 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的诱惑。在大多数情况下,你不需要它 - 而不是OO。