1

我有一个名为Boss的类,它包含我游戏中不同类型 Boss 的不同内部类。我有一个Main类,它使用 Boss 类的getBoss()方法,根据当前运行级别检索适当的 Boss 类对象。

即如果level = 1,那么“level1 boss”将进入游戏。Boss类使用级别变量来选择内部 Boss 类。这就是我想要做的,但问题是getBoss()被用来返回 Boss 内部类的对象

Class Boss extends Sprite{
 public static Level3Boss l3;
 public static Level1Boss l1;
 public stati  Level2Boss l2;

 //Constructor
 public Boss(int level){
  if(level == 1){
    l1 = new Level1Boss();
     }
  else if(level = 2){
    l2 = new Level2Boss();
   }else{
    l3 = new Level3Boss();
   }
 }

 Class Level1Boss extends Sprite{
   //XYZ Propeties of this boss
  }

 Class Level2Boss extends Sprite{
   //XYZ Propeties of this boss
 }

 Class Level3Boss extends Sprite{
   //XYZ Propeties of this boss
   }

   public /*What to type here*/ getBoss(){
        if(level == 1){
         return l1;
       }
      else if(level = 2){
        return l2;
       }else{
        return l3;
      }
    }

}

所以困惑是在 return_type 的地方写什么

  1.Level1Boss for ex: public Level1Boss getBoss(){}

   2.Level2Boss for ex: public Level2Boss getBoss(){}

   3.Level3Boss for ex: public Level2Boss getBoss(){}

  4.or something else ?

有什么方法可以让我从 getBoss() 方法返回这 3 个不同类的对象中的任何一个

我尝试的另一件事 return_type "Object" 它只是工作,但它不能用于设置图像并在全屏窗口上绘制它。

所以提前谢谢

4

8 回答 8

4

创建一个类 Boss 并让 Level1-2-3Boss 扩展它。

例子:

public abstract class Boss{
    public abstract int getX();
    public abstract int getY();
    public abstract int getZ();
}

public class Level1Boss extends Boss{
    ... (implement the abstract methods)
}

public Boss getBoss(){
    ...
}
于 2013-06-04T12:03:26.367 回答
2

您目前正在像工厂一样使用 Boss 类,因此首先要使其更具声明性:

public class BossFactory
{
   private Map<Integer,Boss> bosses = new HashMap<Integer,Boss>();

   public Boss getBoss(int level)
   {
      Boss resultBoss = bosses.get(level);
      if (resultBoss == null)
      {
         // create the boss
         // ideally this would be dynamically instantiated, but  fine for now
         if (level == 1)
         {
             resultBoss = new Level1Boss();
         }
         else if (level == 2)
         {
             resultBoss = new Level2Boss();
         }
         // store the boss
         bosses.put(level, resultBoss);
      }
      return resultBoss;
   }
}

然后将您的关卡老板变成适当的对象层次结构:

class Boss extends Sprite { }
class Level1Boss extends Boss {}
class Level2Boss extends Boss {}
于 2013-06-04T12:15:59.060 回答
1

您需要 return Sprite,因为它对每个班级都很常见。

我更喜欢创建新的子类型或类型接口(例如IBoss),它将所有“老板”分组。那将是更明确且易于理解的解决方案。

于 2013-06-04T11:59:36.380 回答
0

Bossa和 a之间存在关系Level。您必须考虑这种关系,然后再制作您的架构。

无论如何,我建议你尽可能地总结(抽象)你的代码和你的架构。Java 中的多态性将帮助您。

public abstract class Boss extends Sprite {
 public int strength;
 public int name;
 ...
}

public class Level {
 public int number;
 public Boss boss;
 ...
}

定义一些 Boss

public class Megatron extends Boss{

}

您不需要抽象级别。此类的一个实例应该足以满足每个级别。

Boss megatron = new Megatron(100, "Megatron");
Level level1 = new Level(1, megatron);
于 2013-06-04T12:25:03.833 回答
0

您可以返回一个超类,假设 Level 是一个超类,并且所有级别类都扩展它,然后您可以将 Level 作为返回类型,正如您所说的您尝试使用 Object ,但 Object 不会有这些类的方法,所以您可以给 Level 作为超类,所有三个级别的类都扩展它,现在当你返回并调用它的任何方法时,它将调用该类的覆盖方法,级别 1,2,3

Class Level {}

Class Level1Boss extends Level
{
        //its methods
}

Class Level2Boss extends Level
{
        //its methods
}

Class Level3Boss extends Level
{
        //its methods
}

now when you do this

public Level getBoss(){
        if(level == 1){
         return l1;
       }
      else if(level = 2){
        return l2;
       }else{
        return l3;
      }
    }

然后在运行时,这个 Level 对象引用将具有其子类的引用

于 2013-06-04T12:00:31.333 回答
0

您需要返回3个类的共同父类,Sprite然后将其转换回原始类

public Sprite getBoss(){
    if(level == 1){
        return l1;
    }
    else if(level = 2){
        return l2;
    } else{
        return l3;
    }
}

...
Sprite s = getBoss();
if( s instanceof Level1Boss ) {
    ((Level1Boss)s).whatever1();
} else if( s instanceof Level2Boss ) {
    ((Level2Boss)s).whatever2();
} else if( s instanceof Level3Boss ) {
    ((Level3Boss)s).whatever3();
} else {
    // error
}

它类似于流行的方法findViewById(id)。它返回 a View,但您可以将其转换为任何真正的小部件。

于 2013-06-04T12:04:26.377 回答
0

第一:你会回来Sprite的。像这样 :

 public Sprite getBoss() {
        if (level == 1) {
            return l1;
        } else if (level = 2) {
            return l2;
        } else {
            return l3;
        }
    }

第二class用小字符写的java,不是Class

最后==在 if 语句中使用 not =,就像这样:

 else if (level == 2)
于 2013-06-04T12:05:21.123 回答
0

在最后一页中声明它并直接调用函数名称,如下所示:

public static Level3Boss l3;
public static Level1Boss l1;
public static  Level2Boss l2;


    Level3Boss= Boss.Getl3();
    Level1Boss= Boss.Getl1();
    Level2Boss= Boss.Getl2();
于 2013-06-04T12:12:05.590 回答