2012-11-07 87 views
0

的陣列I具有如何呈現對象數組像另一個對象

class ForeighObject {...} 
void someMethod(Object[]) {...} 

ForeighObject[] fobjects = SomeStorage.getObjects(); 

我只能fobjects操縱,所以不能改變的ForeighObject也不someMethod既不結構。如何覆蓋ForeighObject.toString(例如)將它傳遞給someMethod而不復制元素?我可以創建一些適配器類,可以「出示」ForeighObject以僅覆蓋一種方法嗎?

+0

你說你不能改變'ForeighObject'的結構,但是你至少能看到源代碼嗎?如果是這樣,它可能有助於創建一個能夠從「ForeighObject」實例初始化自己的子類。或者,'ForeighObject'類是否有一個構造函數,它將另一個'ForeighObject'作爲參數來克隆它? – jazzbassrob

回答

1

我不太清楚你的意思,但我猜someMethod打電話給toString對其給定的對象數組的元素。

如果是這種情況,那麼您可以使用ForeighObject的包裝子類包含fobjects的每個元素,其中包含預期的toString方法。

例如

//Subclass which wraps a ForeighObject instance.. 
class ForeighObjectWrapper extends ForeighObject { 
    ForeighObject wrapped; 
    ForeighObjectWrapper(ForeighObject toWrap){ 
     super(/* get values from toWrap */); 
     this.wrapped = toWrap; 
    } 
    //Add the custom behaviour.. 
    public String toString(){ 
     return "Some custom behaviour: " + wrapped.toString(); 
    } 
} 

ForeighObject[] fobjects = SomeStorage.getObjects(); //as before.. 
ForeighObject[] fobjectsWrapped = new ForeighObject[fobjects.length]; 
for(ForeighObject ob : fObjects){ 
    fobjectsWrapped.add(new ForeighObjectWrapper(ob)); 
} 

//then call someMethod on fobjectsWrapped instead of fobjects.. 
someMethod(fobjectsWrapped); //will invoke custom behaviour.. 

注意,如果還的someMethod依賴於其他方法的行爲/包裝的實例的屬性,那麼你就需要讓他們在工作像預期的那樣重寫這些方法..

+0

是的,我以這種方式解決了它(除了我用過的作品)。但我想避免這種情況: 'for(ForeighObject ob:fObjects){ fobjectsWrapped.add(new ForeighObjectWrapper(ob)); }' – Cosdix

相關問題