2014-01-13 117 views
1

所以我試圖做一個(不同的)對象的數組(在'三角'類中定義的那些對象之一),在弄亂它一段時間後,這是我有:將對象類型的對象複製到特定類型的對象中

public class ShapeContainer { 

    private Object objects []; 
    private int _size; 
    public static final int init_size = 3; 

    public ShapeContainer(ShapeContainer other){ 
     this.objects = new Object[other.objects.length]; 
     this._size = other._size; 
     for(int i=0; i<_size ;i++){ 
      if (other.objects[i].getClass().equals(Triangle.class)){ 
       this.objects[i] = new Triangle(other.objects[i]); 
      } 
     } 
    } 
} 

對於工作我做了在三角類一個新的構造(注:三角形是內置了3個對象:點P1,P2點,點p3。每個Point對象都由2個雙變量構成:x,y):

public Triangle (Object obj){ 
     this.p1 = new Point(obj.p1); 
     this.p2 = new Point(obj.p2); 
     this.p3 = new Point(obj.p3); 
    } 

現在問題是我不能引用obj.p 1/obj.p2/obj.p3,因爲「Object obj」未被識別爲三角形對象。

所以基本上,有沒有辦法將通用對象識別爲特定對象?如果沒有,你如何處理?

+0

使用實際類型('Triangle')作爲你的數組變量。如果您需要保存多種不同類型的圖形,請創建一個「Shape」接口或抽象類並使用「Triangle extends Shape」。 – chrylis

+1

您的總方法已關閉。你根本不應該使用Object類型。爲什麼不用Point來代替? –

+0

你試圖以錯誤的方式定義拷貝構造函數。只需使用Triangle作爲陣列,你就會好起來的。或者定義一個接口(或一個抽象類)並實現/擴展它們。同時檢查instanceof操作符(如果條件有點奇怪)。 – elbuild

回答

1

有一種方法,雖然它的使用並不是很乾淨,但我個人認爲。這裏是

public Triangle(Object obj){ 
    if (obj instanceof Triangle){ 
     Triangle other = (Triangle) obj; 
     this.p1 = new Point(other.p1); 
     this.p2 = new Point(other.p2); 
     this.p3 = new Point(other.p3); 
    } 
... 
} 

爲什麼我覺得這不是很乾淨?對於開始,我不知道如果對象不是三角形,該怎麼辦。你必須弄清楚,這意味着如果構造函數接收到不是三角形的對象,你會怎麼做?拋出異常?不確定...這通常不會發生在equals這種經常使用instanceof的方法中,因爲那麼您知道您只是返回false

但是,至少你知道怎樣才能「將一個物體識別爲三角形」。

希望這會有幫助

+0

那麼,如果構造函數不是三角形的,那麼構造函數將不會接收到該對象,這意味着我可以在構造函數之外創建異常。 是的,知道如何識別通用對象作爲特定的對象確實有很大的幫助,所以歡呼:) – MrGuy

+0

@MrGuy:爲什麼不首先將它製作爲「公共三角形(Triangle obj)」? – DarkDust

+0

@DarkDust:因爲那個構造函數不會接受一個輸入對象,所以只有一個三角形(注意我想要使用的構造函數「public Triangle(Object obj)」,除了已經存在的「public Triangle Triangle obj)「 – MrGuy

相關問題