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");
}
}

実はいくつか質問がありますが、今のところ私の質問は Martian クラスの 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

この場合、インスタンスでメソッドを呼び出しているためinstanceOfClass、キーワードでへの参照を取得しますthis

this instanceof GreenMartian
于 2013-09-19T14:42:16.797 に答える
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 に答える