Як вярнуць некалькі тыпаў з аднаго метаду

У мяне ёсць клас з імем, як <�моцнага> Boss , які змяшчае розныя ўнутраныя класы для розных тыпаў босаў для маёй гульні. У мяне ёсць Main клас, які выкарыстоўвае метад <�моцны> getBoss() класа Boss, каб retrive адпаведнага аб'екта класа боса, як на бягучы ўзровень бегу.

г.зн., калі ўзровень = 1, то «level1 гаспадар» прыбудзе ў гульні. <�Моцны> Бос клас выкарыстоўвае <�моцны> ўзровень пераменная выбраць ўнутраныя класы боса. гэта тое, што я спрабую зрабіць, але праблема ў тым, <�моцны> 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 ?

Ці ёсць спосаб, з дапамогай якога я магу вярнуць любога з гэтых 3-х аб'ектаў розных класаў ад getBoss() метад

Яшчэ адна рэч, якую я спрабаваў возвращаемый_тип «Object» гэта проста працуе, але не магу быць выкарыстаны ў стварэнні малюнкаў і малявання, для поўнага вокны экрана.

Так што дзякуй загадзя

1

8 адказы

Зрабіце клас 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(){
    ...
}
4
дададзена

Вы карыстаецеся клас Boss, як на заводзе, так што пачаць рабіць што дэкларатыўны:

public class BossFactory
{
   private Map bosses = new HashMap();

   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
дададзена

Вам трэба вярнуцца Sprite , так як яна з'яўляецца агульнай для кожнага класа.

Я б аддаў перавагу, каб стварыць новы падтып, або тыпу інтэрфейсу (напрыклад, IBoss ), што гурт усё «босы». Гэта было б больш выразна і лёгка зразумець рашэнне.

1
дададзена

Вы павінны вярнуць агульны продак з 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 (ід) . Яна вяртае Выгляд , але вы можаце прывесці яго да таго, што віджэт на самай справе.

0
дададзена

First : you will return Sprite . like this :

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

Second : class in java written with small character , not Class

Finally : use == in if statement not = , like that :

 else if (level == 2)
0
дададзена

Вы можаце вярнуць суперкласса, скажам Узровень быць суперкласса, і ўвесь клас ўзроўню пашырае яго, то вы можаце размясціць ўзровень у якасці якое вяртаецца тыпу, як вы сказалі, у паспрабавала з дапамогай аб'екта, але аб'ект не будзе мець метады гэтага класа, так што вы можаце даць ўзровень як суперкласса і ўвесь клас тры ўзроўні працягваецца, цяпер, калі і вярнуцца і выклікаць любы метад на яго, ён будзе выклікаць перакрыты метад гэтага класа, ўзровень 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;
      }
    }

Затым падчас выканання, гэта спасылка на аб'ект ўзроўню будзе мець спасылку на яго падкласаў

0
дададзена

Існуе сувязь паміж Boss і Узровень . Вы павінны думаць аб суадносінах затым зрабіць вашу архітэктуру.

Ва ўсякім выпадку, я прапаную вам падвесці вынікі (анатацыя), наколькі гэта магчыма, ваш код і ваша архітэктура. палімарфізм ў Java дапаможа вам.

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

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

Вызначыць які-Боса

public class Megatron extends Boss{

}

Вам не трэба абстрагавацца ўзровень. Асобнік гэтага класа павінна быць дастаткова для кожнага ўзроўню.

Boss megatron = new Megatron(100, "Megatron");
Level level1 = new Level(1, megatron);
0
дададзена

Аб'явіць яго ў апошняй старонцы і выклікаць прамыя імёны функцый, як гэта:

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


    Level3Boss= Boss.Getl3();
    Level1Boss= Boss.Getl1();
    Level2Boss= Boss.Getl2();
0
дададзена