我有一个名为 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“对象”它只是工作但它不能用于设置图像并在全屏窗口上绘制。
非常感谢提前
答案 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)
Boss
和Level
之间存在关联。你必须考虑这种关系然后建立你的架构。
无论如何,我建议你尽可能地总结(摘要)代码和架构。 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);