2009-12-02 245 views
1

我想我的默認構造函數創建&初始化我的代碼片段中顯示的所有對象。然後,我希望我的參數化構造函數調用默認構造函數,從而創建並初始化這些對象,然後可以在參數化構造函數中使用它,而不會收到NullReferenceException。從參數化構造函數調用默認構造函數

在這種情況下,我不確定使用構造函數的最佳方式(效率最高,代碼少等)是多少。我寧願使用構造函數鏈。

同樣,我對構造函數有一個非常基本的理解,所以如果這是不可能的,那麼請告訴我,告訴我你在這種情況下會做什麼。

class Rectangle 
{ 
    public Line left { get; set; } 
    public Line top { get; set; } 
    public Line right { get; set; } 
    public Line bottom { get; set; } 

    public Rectangle() : this(new Line()) { } 

    public Rectangle(Line diagnonal) 
    { 
     left = new Line(); 
     top = new Line(); 
     right = new Line(); 
     bottom = new Line(); 

     Point beginningDiagonalPoint = new Point(); 
     Point endingDiagonalPoint = new Point(); 

     beginningDiagonalPoint = diagnonal.startPoint; 
     endingDiagonalPoint = diagnonal.endPoint; 

     int begXC = beginningDiagonalPoint.xCoord; 
     int begYC = beginningDiagonalPoint.yCoord; 

     int endXC = endingDiagonalPoint.xCoord; 
     int endYC = endingDiagonalPoint.yCoord; 

     Point rightSideEnd = new Point(); 

     rightSideEnd.xCoord = endXC; 
     rightSideEnd.yCoord = begYC; 

     Point leftSideEnd = new Point(); 

     leftSideEnd.xCoord = begXC; 
     leftSideEnd.yCoord = endYC; 

     // ----------- right side definitions ------------- 
     right.startPoint = endingDiagonalPoint; 
     right.endPoint = rightSideEnd; 

     // ------------ left side definitions -------------- 
     left.startPoint = beginningDiagonalPoint; 
     left.endPoint = leftSideEnd; 

     // ------------ top side definitions ------------- 
     top.startPoint = leftSideEnd; 
     top.endPoint = endingDiagonalPoint; 

     // ------------ bottom side definitions ----------- 
     bottom.startPoint = rightSideEnd; 
     bottom.endPoint = beginningDiagonalPoint; 
    } 
} 

回答

2

通常當你連鎖構造它的其他方法:默認構造函數使用默認值調用更具體的構造函數。說,你有一個Point構造函數,它帶有x和y座標。然後你有默認的Point構造函數調用另一個x = 0和y = 0。這樣你只需編寫代碼來設置一次值。

這裏有一些事情你可以在你的代碼來提高:

  1. 您初始化beginningDiagonalPointendingDiagonalPoint新的點,然後你到diagnonal.startPointdiagnonal.endPoint引用覆蓋它們。您正在創建兩個新點,然後丟棄它們。您不需要創建這些新點。

  2. 您使用默認構造函數創建新點和新行,然後手動設置其字段。你可以創建一個點構造函數來接收兩個座標並設置它們,以及一個接收兩個端點並設置它們的線構造函數。您的代碼應該是這樣的:

    Point rightSideEnd = new Point(endXC, begYC); 
    Point leftSideEnd = new Point(begXC, endYC); 
    
    right = new Line(endingDiagonalPoint, rightSideEnd); 
    left = new Line(beginningDiagonalPoint, leftSideEnd); 
    top = new Line(leftSideEnd, endingDiagonalPoint); 
    bottom = new Line(rightSideEnd, beginningDiagonalPoint); 
    
1

你的例子差不多就是你所要求的。但是,你已經完成了這個工作,它是默認的構造函數,它調用參數化構造函數,給它一個默認參數。這樣做沒有任何問題,這不是你說的你想要的。

此外,它是常規的公共屬性與大寫字母開頭(LeftRightTopBottom代替leftrighttopbottom)。注意,所有的.NET庫類都是這樣做的。

3

您的參數化構造函數已經初始化您的所有屬性。所以,我認爲你所需要做的就是將默認構造函數中的某種默認值傳遞給參數化構造函數。

你需要自己回答這個問題:什麼是默認或空的矩形?我會假設它是一個零大小的。

因此,假設線路需要兩個點作爲參數,我應該這樣做:

public Rectangle() : this(new Line(new Point(0,0), new Point(0,0))) { } 

,包括不太壓縮格式:

public Rectangle() 
    : this(
      new Line(
       new Point(0,0), 
       new Point(0,0) 
     ) 
    ) 
{ } 
7

的參數化的構造後,我剛添加

: this() 

。這是一個猜測,但它似乎工作。

+0

那簡直太棒了 – Mitz 2016-12-15 13:40:45

+1

不幸的是,它似乎在自定義構造函數執行任何代碼之前調用基構造函數 – Lara 2017-02-11 07:56:35