2016-03-05 52 views
0

我想弄清楚如何通過ArrayList迭代時使用對象的方法。但是,有一部分問題是我無法在上面討論的,在ArrayList中,有一些對象,讓我們稱它們爲鞋子,繼承它,讓我們說衣服。但在這個陣列中也有襯衫和襪子,每個都是從衣服繼承而來。所以這個數組是衣服的類型,以便容納不同類型的對象。觀察:如何在迭代ArrayList時抓取對象方法?

ArrayList<Clothes> list = new ArrayList<Clothes>(); 
list.add(shoe); 
list.add(shirt); 
list.add(sock); 

而這個工程,因爲他們都從衣服繼承。不過,我想通過此ArrayList迭代,並使用每個對象的唯一方法,像這樣:

for(Clothes piece : list) { 
...//something like piece.getShoeSize(); 
} 

說我想打印出鞋的尺寸時,按下按鈕,或者每個襪子的顏色當按下不同的按鈕時。我無法做到這一點,因爲在for循環本身中,它只是尋找衣服類型的東西,但是當我將衣服換成鞋子時,它也不起作用,因爲列表是衣服類型的列表。我試過鑄造作爲鞋或襯衫,取決於if語句

if(piece instanceof Shoe) { 
...//((Shoe) piece).getShoeSize(); 
} 

結果但是,這並不工作。如果您有任何想法,我將非常感謝幫助。

編輯:爲了清晰。

這裏的類層次結構:

public class Clothes { 
getColor(); 
} 

public class Sock extends Clothes { 
... 
} 

public class Shirt extends Clothes { 
getSize(); 
} 

public class Shoe extends Clothes { 
getSize(); 
} 

所以我的程序有一個JComboBox,裏面坐了各種各樣的東西。它下面還有一個JTextArea。我試圖讓我的程序執行的是根據JComboBox中選擇的選項,將某些內容打印到JTextArea中。假設在JComboBox中有一個選項SIZE。當它被選中時,我希望list中的所有對象都可以執行方法getSize(),該對象也可以執行方法getSize(),該方法將對象的大小(如XL或10.5)打印到JTextArea中。現在,因爲類衣服沒有getSize()方法(因爲並非所有的衣服都有確定的尺寸,例如襪子),我有問題。 list是Clothes的類型,所以在for循環中,我必須將對象的類型聲明爲Clothes。但piece因此也是類型的衣服,所以當我嘗試運行getSize()時,它給了我一個錯誤,因爲衣服裏面沒有方法getSize()。但list中的一些對象確實有這種方法。所以我的問題是如何訪問ArrayList list中衣物類型的對象的這種方法。

+0

你爲什麼要檢查'shoe'的實例,但是投到'Shoe'。這是錯字嗎? –

+0

@KenBekov不,這不是一個錯字。我檢查列表中的對象是否屬於Shoe類型,但是我必須將它投射到Shoe,因爲'piece'是Clothes類型的,因爲for循環 – ipodfreak0313

+0

我的意思是,在您的代碼片段中,您使用'鞋子從小寫字母開始,「鞋子」從大寫字母開始。不同的東西。當你說'不行'時,你是什麼意思?你有什麼例外嗎? –

回答

0

好吧,我想通了。我不得不這樣做的唯一的事情就是調用

new Main(); 

裏面,把我所有的代碼主要(內部),和一切工作正常。

0

你可以使用繼承來做到這一點很好!

public abstract class Clothes { 

    public abstract void printTo(JTextArea out); 
} 

public class Shoes { 

    private int size; 

    public Shoes(int size) { 
     this.size = size; 
    } 

    @Override 
    public void printTo(JTextArea out) { 
     out.println("Shoe size is: " + size); 
    } 
} 

public class Socks { 

    private String color; 

    public Shoes(String colr) { 
     this.color = color; 
    } 

    @Override 
    public void printTo(JTextArea out) { 
     out.append("Socks color is: " + color); 
    } 
} 

然後,你可以把它簡單地想:

JTextArea myArea = new JTextArea(); 

list.add(new Shoes(12)); 
list.add(new Socks("red with a dash of blue")); 

for (Clothes piece : list) { 
    piece.printTo(myArea); 
} 

並獲得這樣的:

Shoes size is: 12 
Socks color is: red with a dash of blue 

這裏,Clothes有一個abstract method命名爲printTo,讓子類Clothes,如ShoesSocks,定義他們想如何打印。

因此在這種情況下,Shoes將覆蓋printTo並打印出相應的鞋號。這由Shoes定義,並允許直接訪問所有信息,例如size

Socks定義printTo打印出相應的顏色。再次,這是高達Socks定義什麼和如何打印。現在

在迴路中,它並不重要,如果Clothes對象ShoesSocks,它們都繼承ClothesprintTo方法。然後調用此方法,將其保留至Clothes的實現,以確定要打印的內容以及如何打印。


Java Inheritance - Oracle

+0

問題是,我試圖訪問的方法不在Clothes類中,它對於Shoes類是唯一的。 – ipodfreak0313

+0

@ ipodfreak0313是的,除非你正在進行鑄造和'instanceof'檢查(這有很糟糕的代碼味道),像這樣的抽象是要走的路。 – Obicere

+0

我嘗試訪問的方法是Shoe對象不能從Clothes中繼承的方法。 – ipodfreak0313