2016-11-19 38 views
1

我在理解下面的代碼片段(取自書中:MCSD認證工具包(考試70-483)用C#編程)中的一行時遇到問題... 這裏的問題集給出如下:在理解重載類構造函數的語法時遇到困難

使一個橢圓類表示一個橢圓。它應該將橢圓的大小和位置存儲在RectangleF類型的Location屬性中(在System.Drawing名稱空間中定義)。給它兩個構造函數:一個將RectangleF作爲參數,另一個將X位置,Y位置,寬度, 和高度作爲參數。使第二個構造函數調用第一,使構造函數拋出一個異常,如果寬度或高度小於或等於我理解下面一行有問題0

class Ellipse 
{ 
    public RectangleF Location { get; set; } 

    // Constructor that takes a RectangleF as a parameter. 
    public Ellipse(RectangleF rect) 
    { 
     // Validate width and height. 
     if (rect.Width <= 0) 
      throw new ArgumentOutOfRangeException("width", "Ellipse width must be greater than 0."); 

     if (rect.Height <= 0) 
      throw new ArgumentOutOfRangeException("height", "Ellipse height must be greater than 0."); 

     // Save the location. 
     Location = rect; 
    } 

    // Constructor that takes x, y, width, and height as parameters. 
    public Ellipse(float x, float y, float width, float height) 
     : this(new RectangleF(x, y, width, height)) 
    { 
    } 
} 

... 誰能解釋接下來的行是什麼?請在你的解釋中稍微詳細一點!

:this(new RectangleF(x, y, width, height)) 

在此先感謝!

+0

':這個(新的RectangleF(X,Y,寬度,高度))'調用'公共橢圓(的RectangleF RECT)'構造。基本上你的橢圓是由'x,y,寬度和高度'或'矩形'構造的。當你從'x,y,width和height'構造它時,你將它們作爲參數傳遞給構造一個'rectangle',它作爲參數傳遞給你的其他構造函數。最後,您只使用一個構造函數 - 接受「矩形」的構造函數,另一個只是「重定向」它(將矩形參數變換爲矩形) –

+0

因此,您不必重複你的其他構造函數的邏輯。 –

回答

2

它能做什麼

有問題的行用提供給構造器的參數RectangleF一個新的實例。然後使用第一個構造函數初始化Ellipse的實例與創建的RectanlgeF

爲什麼這是有用的

有相當多的邏輯在初始化Ellipse。一個人可以用它在第一個construtor中完成的方式進行初始化,但這意味着邏輯的重複 - 伴隨着所有的壞處。通過這種方式,您可以獲得一個初始化新的Ellipse的resposibility,但您可以通過多種方式創建此類實例。

考慮在RectangleF可用的位置創建Ellipse的新實例,並且只實現Ellipse的第一個構造函數。您將不得不通過調用

var ellipse = new Ellipse(myrect.X, myrect.Y, myrect.Width, myrect.Height); 

'解構'該矩形通過額外的contrsutor,這更方便。

創建不同版本的構造函數(或方法)通常被稱爲「語法糖」,因爲它使編程人員的生活變得更加美好。

希望這會有所幫助。

1

讓我們以你自己的問題。它解釋了許多事情,因爲你從書中拿走它,但在現實世界中,你必須爲自己思考。

  1. :這個(新的RectangleF(X,Y,寬度,高度)) 上面的行被用於調用另一個構造和也稱爲構造函數。當你使用第一個匹配簽名的構造函數時。它意味着你分配給任何一個類變量的值在那個構造函數中被賦值,然後你的構造函數被調用。因此,在當前構造函數中,如果您想執行任何其他不可能在基礎構造函數中執行的邏輯,那麼您可以執行此操作。

  2. 代碼重用是這裏的主要關注點。現在爲什麼? 問題說,如果寬度和高度小於零,那麼你必須拋出異常。現在您已經爲您的類創建了兩個構造函數,因爲您希望類的用戶可以將Ecplice設置爲x,y,寬度,高度格式或矩形格式。

    • 要做到這一點的一種方法是你寫寬度和高度登錄兩個地方都不好。
    • 第二個問題是,如果你有使用第一個構造函數,那麼它將值作爲矩形傳遞,第二個作爲x,y,寬度,高度傳遞,如果你不把這個值存儲在單獨的地方,那麼在代碼中稍後出現問題正在調用哪個構造函數。因爲如果你已經調用了第一個,那麼基於第二個x,y,width,height的所有邏輯將不起作用,如果你調用了第二個邏輯,那麼與Rectangle相關的邏輯就不起作用。所以你可能需要存儲額外的信息,然後調用哪個構造函數,在這種情況下不好,因爲RectangleF會存儲相同的值。