0

私がやろうとしているのは、ハザードクラスの影響値を合計することです

たとえば、居住者のリストを調べ、危険を見つけ、そこから影響量を取得します。次に、すべての危険の合計の影響を合計し、その値を私に返します。

以下に、CaveクラスHazardクラスAbstractOccupantクラスがあります。

洞窟にハザードを追加すると、HashSetの占有者になります。getImpact()メソッドを使用してエネルギーレベルを取得しようとすると、ハザードにあり、占有者ではないため、メソッドにアクセスできません。

Occupantを拡張するクラスが他に2つあります。プレーヤーアイテム

getImpact()メソッドを使用できるように、HashSetに追加するときに、ハザードをハザードクラスとして保持する方法が見つかりません。

これは、HashSetに追加するときに、他のクラスのPlayerとItemにも対応する必要があります。


public class Cave {

HashSet<Occupant> occupants;
private double impact;

/**
 * Creat a new Cave instance with no occupants.
 */
public Cave() 
{
    occupants = new HashSet<Occupant>();
}

/**
 * Adds an occupant to a Cave if the occupant is not already there and
 * if cave currently has fewer than the maximum number of occupants.
 * @param occupant, the occupant to add
 * @return  true if successfully added
*/
public boolean addOccupant(Occupant occupant) {
    boolean validNewOccupant = occupant != null;
    boolean enoughRoom = occupants.size() < MAX_OCCUPANTS;
    if (validNewOccupant && enoughRoom) {
        validNewOccupant = occupants.add(occupant);
    }

    return validNewOccupant && enoughRoom;
}

/**
 * Gets the sum of the impact from all hazards in the cave
 * @returns hazardEnergyImpact
 */
public double getHazardEnergyImpacts(){
    double energyImpact = 0.0;
    for( Occupant occupant : occupants ){
        if(occupant.toString() == "!"){
            energyImpact += occupant.getImpact();
        }
    }
    return energyImpact;
}
}

public abstract class Occupant {

private Address address;
private String name;

/**
 * Construct an occupant for a known address & name.
 * @ param row, row of address  
 * @ param column, row of address.
 * @ param name, occupant's name
 */
public Occupant(Address address, String name) {
    this.address = address;
    this.name = name;
}

@Override
public String toString(){
    return "";
}
}

public class Hazard extends Occupant  {

private String longDescription;
private double impact;

/**
 * Construct a hazard with know attributes
 * @param row
 * @param column
 * @param name
 * @param longDescription
 * @param impact
 */
public Hazard(Address address, String name, String longDescription, double impact) {
    super(address, name);
    this.longDescription = longDescription;
    this.impact = impact;
}

@Override
public String toString(){
    return "!";
}

/**
 * gets impact amount
 * @returns impact
 */
public double getImpact(){
    return this.impact;
}
}
4

4 に答える 4

3

別のオプションは、getImpact()メソッドをOccupantに追加することです。

public double getImpact() {
    return 0.0;
}

一方、Hazard@Override実装では、すでに設定されているインスタンス変数がgetImpact()返されます。impact次に、ループは次のように簡略化されます。

public double getHazardEnergyImpacts() {
    double energyImpact = 0.0;
    for( Occupant occupant : occupants ) {
        energyImpact += occupant.getImpact();
    }
    return energyImpact;
}

後で適切なインターフェースの抽象化に抽出する必要がある場合、最新のIDEがそれを簡単にするのは良いことです。

于 2011-04-28T03:02:49.147 に答える
1

繰り返し処理するときに、各アイテムが次のようになっているoccupantsかどうかを確認できます。Hazard

for(Occupant occupant : occupants){
    if(occupant instanceof Hazard){
        Hazard hazard = (Hazard) occupant; // now it's safe to cast
        double impact = hazard.getImpact();
        // do what you want with impact
    }
}
于 2011-04-28T02:35:14.113 に答える
0

ジェレミーは私を殴りました。

ただし、instanceofが常に最良のソリューションであるとは限りません。ただし、この場合は修正です。

抽象クラスを使用する代わりに、動作にここでインターフェイスを使用することを実際にお勧めします。ただし、抽象クラスを使用する必要がある場合、これを行うためのより効率的な方法は、子クラスで使用する抽象メソッドを作成することです。それぞれの子でそれらすべてをオーバーライドする必要がありますが、すべての場合にそれらを実装する必要はありません。

于 2011-04-28T02:48:10.970 に答える
0

ここではVisitorパターンを使用します。

public interface Occupant {
  void interact(Player p);
}

public class Player {
  public void handleInteraction(Hazard hazard) {
    // add code here
  }
  public void handleInteraction(Person person) {
    // add code here
  }
}

public class Hazard implements Occupant {
  public void interact(Player p) {
    p.handleInteraction(this);
  }

  public double getImpact(){
    return this.impact;
  }
}
于 2011-04-28T02:59:51.790 に答える