1

我有这样的问题 - 有一个抽象类,以及从该类继承的许多类。我有作为非抽象类的参数对象的函数。它必须返回非抽象类的对象,但我知道在运行时是哪个。有任何想法吗?

这里的示例代码,它的样子:

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 */
}

感谢帮助。

4

3 回答 3

3

放入public var abstract bar() {}抽象类。

然后所有的孩子都必须执行bar()

那么你的 if-block 将是

if(rnd.nextInt(2) == 0) {
      return a;
    } else {
      return b;
    }
于 2012-12-12T19:55:36.967 回答
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();
于 2012-12-12T19:55:56.123 回答
0

或者你可以做一个班级演员表。

if(a instanceof Circle)
{ Circle c = (Circle) a;
  c.bar();
}

if(a instanceof Square)
{ Square s = (Square) a;
  s.bar();
}
于 2012-12-12T20:35:39.040 回答