好的家伙我有一个带有'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 [或Green] martian”+ id。我需要确定火星人的类型,我开始使用instanceof但是像这样“火星人无法解析为变量”。我正在尝试确定这是否是最好的方法,或者equals()是否是确定类型的最佳方法?
这也是我第一次使用“克隆”,所以不确定它是如何工作的,但有一种想法是否有办法确定“克隆”是什么并确定它的方式?
感谢您的帮助!
答案 0 :(得分:5)
没有
public String toString(){
String str;
if (Martian instanceof GreenMartian) {
}
abstract
Martian
课程中的是一个坏主意。您不希望父类依赖其子级。
在每个子类中实现toString()
方法而让多态实现其工作。
如果你绝对必须
if (Martian instanceof GreenMartian) {
错了。您使用instanceof
instanceOfClass instanceof SomeClass
在这种情况下,您会使用instanceOfClass
关键字引用this
,因为您在实例上调用方法
this instanceof GreenMartian
答案 1 :(得分: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);
}
答案 2 :(得分:0)
您可以使用String name = this.getClass().getSimpleName()
获取课程名称。然后,您可以检查name.substring(0,1).equals("G")
或name.substring(0,1).equals("R")
以检测红色或绿色。
答案 3 :(得分:0)
FWIW,它应该是if (this instanceof GreenMartian)
- 但是每当你想要使用这样的低垂(up ??)时,恕我直言,这是一个糟糕的OO设计的标志。而是为你的火星人写一个专门的toString()
方法。您应该在o==null
方法中检查equals()
。
答案 4 :(得分:0)
if(此实例为GreenMartian)