1

私はそのような問題を抱えています-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ブロックは次のようになります

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 に答える