簡體   English   中英

使用另一個類中的方法從一個類中獲取實例變量?

[英]Getting instance variable from one class using a method in another class?

我如何從Dog類中獲取實例變量生命值,並通過eat(X x)方法將其傳遞給Lion類?

我試圖讓Lion吃掉實例變量中的Dog和減點,該實例變量存儲在Lion類的新變量中。

類獅子

package helloworld;

public class Lion {
public String name;
public int heightCMeters;
public int lengthCMeters;
public float weightKilos;
public int hitPoints;

public Lion(int hitPoints, String name, int heightCMeters, int lengthCMeters, float weightKilos) {
    this.name = name;
    this.heightCMeters = heightCMeters;
    this.lengthCMeters = lengthCMeters;
    this.weightKilos = weightKilos;
}
public void lionDetails() {
    System.out.println("Name: " + this.name);
    System.out.println("Height CM: " + this.heightCMeters);
    System.out.println("Length CM: " + this.lengthCMeters);
    System.out.println("Weight Kilos: " + this.weightKilos);
}
public void eat(X x) {
    int hitPoints = x.hitPoints  - 10;
    System.out.println(x)
}
}

類狗

package helloworld;

public class Dog {
public String name;
public int heightCMeters;
public int lengthCMeters;
public float weightKilos;
public int hitPoints;

public Dog(int hitPoints, String name, int heightCMeters, int lengthCMeters, float weightKilos) {
    this.name = name;
    this.heightCMeters = heightCMeters;
    this.lengthCMeters = lengthCMeters;
    this.weightKilos = weightKilos;
}
public void dogDetails() {
    System.out.println("Name: " + this.name);
    System.out.println("Height CM: " + this.heightCMeters);
    System.out.println("Length CM: " + this.lengthCMeters);
    System.out.println("Weight Kilos: " + this.weightKilos);
}
public void eat(X x) {
    int hitPoints = x.hitPoints - 10;
    System.out.println(x)

}
}

基本上,獅子可以吃狗,反之亦然(這很奇怪,狗沒有勇氣攻擊獅子)。 無論如何,您需要的是一個代表吃動物的動物的abstract class ,該類應包含您提到的hitPoint

abstract class X {
 public int hitPoints; 
}
// Lions are edible
class Lion extends X{

  public void eat(X x) { // pass an edible object
  int hitPoints = x.hitPoints  - 10;
  System.out.println(x)
  }
}  

//Dogs are edible as well
class Dog extends X{

 public void eat(X x) { // pass an edible object
  int hitPoints = x.hitPoints  - 10;
  System.out.println(x)
  }
}

現在,獅子要吃狗

Lion predator = new Lion();
Dog prey = new Dog(); 
predators.eat(prey); // this passed dog will be eaten 

最好的方法是為Lion類編寫一個測試類或編寫main方法,這將維護兩個類的生命值。

 class Test{

    public static void main(String[] args){

         Dog puppy=new Dog(10,"Moti",12,12,31);
         Lion oldLion=new Lion(20,"Old Lion",12,12,43);

         oldLion.eat(puppy);

    }

 }

您必須具有一個抽象類Animal ,在其中定義了所有常用方法。

對於獅子課的eat

public void eat (Animal animal) {
    this.hitPoints-=animal.hitPoints;
}

對於Dog類的eat方法,邏輯也相同。

我將通過Edible接口使任何可以吃的東西。 然后,該接口可以具有isEaten方法,該方法可以計算出生命值。

像這樣:

public interface Edible {
void isEaten(final int hitPointsToDeduct);
}

然后,您的獅子和狗會執行此操作,以便可以食用它們。

狗類將是:

public class Dog implements Edible {

    public String name;
    public int heightCMeters;
    public int lengthCMeters;
    public float weightKilos;
    public int hitPoints;

    public Dog(final int hitPoints, final String name, final int heightCMeters, final int lengthCMeters, final float weightKilos) {
        this.name = name;
        this.heightCMeters = heightCMeters;
        this.lengthCMeters = lengthCMeters;
        this.weightKilos = weightKilos;
    }

    public void dogDetails() {
        System.out.println("Name: " + this.name);
        System.out.println("Height CM: " + this.heightCMeters);
        System.out.println("Length CM: " + this.lengthCMeters);
        System.out.println("Weight Kilos: " + this.weightKilos);
    }

    public void eat(final Edible x) {
        x.isEaten(10);
        System.out.println(x);
    }

    public void isEaten(final int hitPointsToDeduct) {
        this.hitPoints = this.hitPoints - hitPointsToDeduct;
    }
}

和獅子班:

public class Lion implements Edible {

    public String name;
    public int heightCMeters;
    public int lengthCMeters;
    public float weightKilos;
    public int hitPoints;

    public Lion(final int hitPoints, final String name, final int heightCMeters, final int lengthCMeters, final float weightKilos) {
        this.name = name;
        this.heightCMeters = heightCMeters;
        this.lengthCMeters = lengthCMeters;
        this.weightKilos = weightKilos;
    }

    public void lionDetails() {
        System.out.println("Name: " + this.name);
        System.out.println("Height CM: " + this.heightCMeters);
        System.out.println("Length CM: " + this.lengthCMeters);
        System.out.println("Weight Kilos: " + this.weightKilos);
    }

    public void eat(final Edible x) {
        x.isEaten(10);
        System.out.println(x);
    }

    public void isEaten(final int hitPointsToDeduct) {
        this.hitPoints = this.hitPoints - hitPointsToDeduct;
    }
}

這樣做的好處是, hitPoints字段集中在一個對象的中央。 獅子並沒有拉出Dogs hitPoints的價值。 請在此頁面上獲得有關“不要問”概念的解釋。

編輯

剛玩完游戲,我注意到您沒有在任何一個構造函數中設置hitPoints值,並且您的對象使用對象引用而不是細節進行打印。 為此,重寫toString方法。 這是Dog clas的重寫部分:

public Dog(final int hitPoints, final String name, final int heightCMeters, final int lengthCMeters, final float weightKilos) {
    this.name = name;
    this.heightCMeters = heightCMeters;
    this.lengthCMeters = lengthCMeters;
    this.weightKilos = weightKilos;
    this.hitPoints = hitPoints;
}

@Override
public String toString() {
    final StringBuilder builder = new StringBuilder();
    builder.append("Name: ");
    builder.append(this.name);
    builder.append(", Height CM: ");
    builder.append(this.heightCMeters);
    builder.append(", Length CM: " );
    builder.append(this.lengthCMeters);
    builder.append(", Weight Kilos: ");
    builder.append(this.weightKilos);
    builder.append(", Hit Points: ");
    builder.append(this.hitPoints);
    return builder.toString();
}

因此,使用這種主要方法:

public static void main(final String[] args) {
    final Lion adam = new Lion(500, "Adam", 5, 5, 5);
    final Dog fido = new Dog(500, "Fido", 5, 5, 5);
    adam.eat(fido);
}

我得到以下輸出:

Name: Fido, Height CM: 5, Length CM: 5, Weight Kilos: 5.0, Hit Points: 490

請注意,生命值從500降低至490。

基於sleiman jneidi的響應:您應該創建一個包含hitPoints和eat方法的摘要(每個動物的行為相同),然后不必每次都編寫該方法

abstract class X {
 public int hitPoints; 
 public void eat(X x) { // pass an edible object
  int hitPoints = x.hitPoints  - 10;
  System.out.println(x)
  }
}
// Lions are edible
class Lion extends X{


}  

//Dogs are edible as well
class Dog extends X{

}

Animal類中包含的實例變量是Lion和Dog類繼承的。 每次通過將Animal對象作為參數調用eat(Aniamal a)方法時,它都會保留該值。 因此,與處理傳遞給eat方法的Animal對象中包含的實例變量相比,我們可以對實例變量執行各種功能。

public class Animal {
    public int hitPoints;
}

public class Lion extends Animal {

    public String name;

    public Lion(String name) {
        this.name = name;
    }
    public void eat(Animal a) {
        a.hitPoints = a.hitPoints - 10;
        System.out.println(this.name + " Has: " + a.hitPoints + " HitPoints");
}

}


public class Dog extends Animal {

    public String name;

    public Dog(String name) {
        this.name = name;
    }
    public void eat(Animal a) {
        a.hitPoints = a.hitPoints - 10;
        System.out.println(this.name + " Has: " + a.hitPoints + " HitPoints");
}

}

public static void main(String[] args) {
    Cat adam = new Cat("adam");
    Lion dam = new Lion("dam");
    dam.eat(adam);
}       

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM