2013-02-18 47 views
2

,對不起,我是初學者剛開始使用Java和我遇到這個問題Java中的對象設置爲一個未知的類類型

我有兩個班,說他們是

class Dog { 

} 

class Cat { 

} 

然後,我創建了與這兩個

Object[][] myAnimal = new Object[4][5]; 

我想設置一個變量等於隨機對象從我的陣列或者一個充滿了一個數組,但我不知道它來自哪個類。有沒有辦法做到這一點?

+2

你可以在運行時檢查一個對象的類('obj.getClass()'),但這並不一定能幫你從糟糕的設計中解脫出來。你想達到什麼目的? – Perception 2013-02-18 02:28:35

+0

if(myAnimalObj instanceof CAT)或if(myAnimalObj instanceof CAT) – Jayamohan 2013-02-18 02:33:20

+0

好吧我試圖模擬一個遊戲,你有一隻貓還是一隻狗,以及根據應該發生的不同事情。我正在循環訪問數組,並嘗試設置一個等於當前單元格的變量,然後使用if語句來檢查它是否爲狗或貓。 – 2013-02-18 02:33:26

回答

1

好吧,假設你的數組充滿了兩個班的一個實例,你可以這樣做:

if(myAnimal[x][x] instanceof Dog) //it is an instance of the Dog class 

你真的不應該做這樣的事情特別是作爲一個初學者,雖然。你說你試圖選擇一隻隨機的狗或貓?更好的方法是保留兩個單獨的數組,一個用於狗,一個用於貓。然後你可以從兩個數組中選擇一個隨機元素,你就會知道你正在處理的是什麼類。

+0

哦,好的。好吧,如果我做你給的例子,我可以設置一個新的對象到當前的一個。喜歡狗myDog = myAnimal [x] [x]? – 2013-02-18 02:39:43

+0

讓他們在兩個單獨的數組中的好處是您可以創建一個類Dog的數組和一個Cat類的數組。所以當你這樣做時,你不必創建一個新的對象。你可以說,我隨機選擇的動物是catArray [5]。您可以使用數組中的該元素工作目錄。例如catArray [5] .someCatFunction() – 2013-02-18 02:42:48

+0

我應該說陣列解決方案會起作用,但是你真正需要的是創建一個像Code-Guru一樣的類動物。這樣你就可以擁有一系列可能是貓或狗的動物。 – 2013-02-18 02:53:18

0

我認爲你必須使用反射api,如果你想要那個類的實例,它必須在運行時檢查任何對象...我認爲你的問題是你不想把條件靜態,如何把條件動態地爲不同的動物,今天它的狗,老虎tomrrow它的牛或等等...因此plz使用refelction api

3

理想的解決方案是創建您自己的超類,說Animal它已經聲明瞭抽象方法。例如,你可以這樣做:

abstract class Animal { 
    public abstract void speak(); 
} 

然後CatDog各自提供自己的實現的抽象方法:

class Cat { 
    public void speak() { 
     System.out.println("Meow!"); 
    } 
} 

class Dog { 
    public void speak() { 
     System.out.println("Woof!"); 
    } 
} 

現在,你可以簡單地聲明您的數組作爲

Animal[][] myAnimal = new Animal[4][5]; 

在陣列中放置一些動物:

myAnimal[0][0] = new Dog(); 
myAnimal[0][1] = new Cat(); 

,然後告訴動物說話:

myAnimal[0][0].speak(); 
myAnimal[0][1].speak(); 

我已經離開了語法main()這裏,但我希望你可以把這個一起自己。這裏使用的概念被稱爲「多態性」。我強烈建議您研究它以幫助您在設計代碼時使用這個關鍵的OO概念。

+0

沒有創建一個單獨的類,我可以只是調用你已經列出的方法。像if(instanceof Dog){myAnimal [0] [0] .speak()} – 2013-02-18 03:50:30

+0

@BillyThompson'instanceof'是一個二元運算符。這意味着它需要*兩個*參數,如'if(myAnimal [0] [0] instanceof Dog){myAnimal [0] [0] .speak();}'。是的,如果'Animal'有一個具體的'speak()'方法,你可以*做到這一點。但是,不管動物是狗還是貓,它都會做同樣的事情。我在回答中給出的建議說明了多態的概念。一個好處是,你不需要像你所建議的那樣的「if」陳述。您還可以使用更少的代碼輕鬆添加更多的動物,如「馬」,「牛」,「羊」,「鴨」等。 – 2013-02-20 01:11:02

1

在這種情況下,訪問者模式將是真正的好方法。比方說,你正在製作一款需要針對不同對象(貓,狗,金錢等)作出不同反應的遊戲。所以這樣做:

做一個接口IAnimal已經定義如下:

interface IAnimal { 
    void visit(IAnimalVisitor visitor, Object param); 
} 

class Cat implements IAnimal { 
    void visit(IAnimalVisitor visitor, Object param) { 
     visitor.visit(this, param); 
    } 
} 

class Dog implements IAnimal { 
    void visit(IAnimalVisitor visitor, Object param) { 
     visitor.visit(this, param); 
    } 
} 

IAnimalVisitor將包含定義的每個動物類型一個visit()方法。所以它會是這樣的:

interface IAnimalVisitor { 
    public void visit(Cat c, Object param); 
    public void visit(Dog c, Object param); 
} 

然後,你可以使用把你的邏輯來處理貓和狗,因爲你想要的。例如:

class AnimalFeeder implements IAnimalVisitor { 
    public void visit(Cat c, Object param) { 
     c.feed(milk); 
     c.feed(cat_food); 
    } 
    public void visit(Dog d, Object param) { 
     d.feed(dog_food); 
    } 
} 

然後你就可以使用上面的食物餵養類養活你IAnimal數組是這樣的:

IAnimal[] animals = new IAnimal[] { new Cat(), new Dog(), 
    new Dog(), new Cat() }; 

IAnimalVisitor feeder = new AnimalFeeder(); 
for(IAnimal animal : animals) { 
    animal.visit(feeder, null); 
} 

可以實現充分的自由來處理類中層次結構的任何水平。只需將visit()用於每個動物類別類型IAnimalVisitor

相關問題