如何从单个方法返回多个类型

时间:2013-06-04 11:56:31

标签: java overloading inner-classes return-type

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

即。如果等级= 1则“等级1老板”将到达游戏中。 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“对象”它只是工作但它不能用于设置图像并在全屏窗口上绘制。

非常感谢提前

8 个答案:

答案 0 :(得分:4)

制作一个班级Boss并让Level 1-2-3 Boss扩展。示例:

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(){
    ...
}

答案 1 :(得分: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 {}

答案 2 :(得分:1)

您需要返回Sprite,因为这是每个班级的共同点。

我更愿意创建新的子类型,或者键入接口(例如IBoss),它会对所有“老板”进行分组。这将是更明确和易于理解的解决方案。

答案 3 :(得分:0)

你可以返回一个Superclass,比如Level是一个Superclass,所有级别类都扩展它,然后你可以把Level作为返回类型,就像你用Object试过的那样,但是Object不会有这些类的方法,所以你可以给Level作为一个超类,并且所有三个级别的类都扩展它,现在当你返回并调用它上面的任何方法时,它将调用该类的重写方法,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对象引用将具有其子类的引用

答案 4 :(得分: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)。它返回一个View,但您可以将它转换为真正的小部件。

答案 5 :(得分:0)

首先:您将返回Sprite。像这样:

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

第二次:用小字符编写的java中的class,而不是Class

最后:在if语句中使用==而不是=,就像那样:

 else if (level == 2)

答案 6 :(得分:0)

在最后一页中声明它并直接调用这样的函数名称:

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


    Level3Boss= Boss.Getl3();
    Level1Boss= Boss.Getl1();
    Level2Boss= Boss.Getl2();

答案 7 :(得分:0)

BossLevel之间存在关联。你必须考虑这种关系然后建立你的架构。

无论如何,我建议你尽可能地总结(摘要)代码和架构。 Java中的Polymorphism将对您有所帮助。

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);