我想做的是总结危险类别中的影响值
例如,它将遍历居住者列表,找到危险并从中获取影响量。然后将所有危险的总影响相加,并将该值返回给我。
下面有洞穴类、危险类和抽象居住者类。
当向洞穴添加危险时,它就会成为 HashSet 中的占用者。 当尝试使用 getImpact() 方法获取能量水平时,无法访问该方法,因为它是在 Hazard 而不是 Occupant 中。
我还有另外两个类也扩展了 Occupant。 玩家和元素。
在添加到 HashSet 时,我找不到将危险保留为 Hazard 类的方法,以便可以使用 getImpact() 方法。
在添加到 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;
}
}
最佳答案
另一种选择是将 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;
}
如果您稍后需要提取到适当的接口(interface)抽象,现代 IDE 可以让这变得简单,这是件好事。
关于java - 无法从 HashSet 中的类调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5812912/