0

好的,伙计们,我有一个带有“MartianManager”类的程序:*注意代码不完整仍然有一些缺失的部分只是提供了整个代码以供参考,以了解完成后的外观

import java.util.ArrayList;

public class MartianManager {
private ArrayList<Martian> martians;
private ArrayList<Martian> teleporters;

public void addMartian(Martian m) {
    martians.add(m);
    if(m instanceof GreenMartian)
        teleporters.add(m);
}
//public Object clone() {

public Martian getMartianClosestToID(int id) {  
}
public void groupSpeak() {
    for(Martian m : martians) {
        m.speak();
    }
}
public void groupTeleport(String dest) {    
}
}

和火星类:

public abstract class Martian implements Cloneable {
int id;

public Martian(int id) {
    this.id = id;
}
public Object clone() throws CloneNotSupportedException {
    return super.clone();
}
public int getId() {
    return id;
}
public boolean equals(Object o){
    return this.getId() == ((Martian)o).getId();    
}
public abstract void speak();

public String toString(){
    String str = "";
    if (this instanceof GreenMartian) {
        str = "Green martian" + id;
    }
    if (this instanceof RedMartian) {
        str = "Red martian" + id;
    }
    return str;
}       
}

它用 GreenMartian 扩展:

public class GreenMartian extends Martian implements ITeleport{

public GreenMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Grobldy Grock");
}
public void teleport(String dest) {
    System.out.println(id + "teleporting to " + dest);
}

}

还与 RedMartian 一起扩展:

public class RedMartian extends Martian {

public RedMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Rubldy Rock");
}
}

我实际上有几个问题,但现在我的问题是在火星类的 toString 中。它应该返回一个像这样的字符串:“Red [or Green] martian” +id。我需要确定火星人的类型,我开始使用 instanceof 但就像这样“火星人无法解析为变量”。我正在尝试确定这是否是最好的方法,或者 equals() 是否是确定类型的最佳方法?

这也是我第一次使用“克隆”,所以不确定它是如何工作的,但有一个想法是有没有办法确定“克隆”是什么并以这种方式确定?

感谢您的任何帮助!

4

5 回答 5

5

public String toString(){
    String str;
    if (Martian instanceof GreenMartian) {  
}

abstract Martian课堂上是个坏主意。你不希望你的父类依赖它的子类。

toString()而是在每个子类中实现一个方法,让多态性来完成它的工作


如果你绝对必须

if (Martian instanceof GreenMartian) {  

是错的。你instanceof这样用

instanceOfClass instanceof SomeClass

在这种情况下,您将获得instanceOfClassthis关键字的引用,因为您正在实例上调用该方法

this instanceof GreenMartian
于 2013-09-19T14:42:16.797 回答
1

你真的不应该让父类引用任何扩展它的类。这是不好的做法(并且可能实际上不起作用,我没有测试过)。您实际上应该只覆盖每个扩展类中的 toString 函数。

public class GreenMartian extends Martian implements ITeleport{

    public GreenMartian(int id) {
        super(id);
    }
    public void speak() {
        System.out.println(id + "Grobldy Grock");
    }
    public void teleport(String dest) {
        System.out.println(id + "teleporting to " + dest);
    }

    @Override
    public String toString() {
         return "GreenMartian: whatever info you'd like to include.";
    }

}

现在,如果您想对所有子类使用类似的格式,您有两个选择。一种是调用父类的 toString 方法,并将其添加到子类的 toString 方法中。

@Override
public String toString() {
    return super.toString() + "GreenMartin: info.....";
}

//The parent toString could look like this:
@Override
public String toString(){
    return "Martian( ... put any parent class info here, id ect)";
}

GreenMartian toString 调用的最终输出可能如下所示:

Martian(id:23) GreenMartian(planet:greenburg)

第三种选择是在父类中使用通用字符串格式。例如,在父类中,包含此属性:

protected static final String format = "Class: %s, id: %s, info: %s";

然后,在子类 toString 中,您可以这样做:

@Override
public String toString() {
    return String.format(format,this.getClass().toString(),id,myInfo);
}
于 2013-09-19T14:53:39.973 回答
0

您可以使用String name = this.getClass().getSimpleName()来获取您的班级的名称。然后您可以检查name.substring(0,1).equals("G")name.substring(0,1).equals("R")检测红色或绿色。

于 2013-09-19T14:46:31.923 回答
0

FWIW,它应该是if (this instanceof GreenMartian)- 但恕我直言,每当你想使用这样的沮丧(向上??),这是糟糕的 OO 设计的标志。而是为你的火星人写一个专门的toString()方法。你真的应该检查o==null你的equals()方法。

于 2013-09-19T14:47:40.403 回答
0

火星人不是变量。试试这个:

如果(这个绿色火星实例)

于 2013-09-19T14:48:43.317 回答