我遇到了这样的问题 - 有一个抽象类,还有许多继承自该类的类。我有一个函数,它作为非抽象类的参数对象。它必须返回非抽象类的对象,但我知道在运行时哪个是异常的。有什么想法吗?
这里是示例代码,它的外观如下:
public abstract class Shape {
int x, y;
void foo();
}
public class Circle extends Shape {
int r;
void bar();
}
public class Square extends Shape {
int a;
void bar();
}
在两个类中,方法bar()执行相同的操作。现在做这样的事情:
/* in some other class */
public static Shape iHateWinter(Shape a, Shape b) {
Random rnd = new Random();
Shape result;
/*
btw. my second question is, how to do such thing:
a.bar(); ?
*/
if(rnd.nextInt(2) == 0) {
/* result is type of a */
} else {
/* result is type of b */
}
感谢您的帮助。
答案 0 :(得分:3)
将public var abstract bar() {}
放入抽象类中。
然后所有孩子都必须实施bar()
。
然后你的if-block将是
if(rnd.nextInt(2) == 0) {
return a;
} else {
return b;
}
答案 1 :(得分:2)
你似乎让自己变得复杂。
/*
btw. my second question is, how to do such thing:
a.bar(); ?
*/
您将bar()
添加到Shape
并致电a.bar();
;
if(rnd.nextInt(2) == 0) {
/* result is type of a */
} else {
/* result is type of b */
这是相当迟钝的编码。如果您不打算使用它,那么为什么要传递一个对象并不清楚。即你只需要它的课程。
result = rnd.nextBoolean() ? a.getClass().newInstance() : b.getClass().newInstance();
答案 2 :(得分:0)
或者你可以进行一场演员表。
if(a instanceof Circle)
{ Circle c = (Circle) a;
c.bar();
}
if(a instanceof Square)
{ Square s = (Square) a;
s.bar();
}