我有一个特定的问题,比方说,我有
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) 有任何想法吗? :)
答案 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通过返回countx
或county
来实现这些方法。
Edit2:我刚注意到您的countx
和county
成员是static
!为什么要这么做? static
意味着,他们不会对您的班级实例“行动”,而是对您的班级对象(他们是“班级成员”)。这意味着您可以通过A.countx
或B.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。