2012-12-12 217 views
3

有沒有更好的辦法做到我在做什麼:構造函數重載和類參數

class Sample { 

int SampleValueX, SampleValueY; 
string SampleFacing;  

public Sample(int samplevaluex, string samplefacing) 
{ 
    SampleValueX = startpositionx; 
    SampleValueY = 0; 
    SampleFacing = samplefacing; 
} 

public Sample(int samplevaluey, string samplefacing) 
{ 
    SampleValueX = 0; 
    SampleValueY = startpositionx; 
    SampleFacing = samplefacing; 
} 
} 

這甚至被稱爲構造函數重載?糾正我,如果我錯了。

+0

如果您在方法(或ctor)上具有相同的參數順序類型,則不允許您編譯。 –

+2

ough ...相同的構造函數(參數類型)但邏輯不同?更好地使用帶有輔助名稱的靜態函數(createX,createYSample),並給予構造函數設置所有3個成員的權力。 – Najzero

+0

簽名需要不同,因爲簽名是Sample(int,string),所以你不能使用 –

回答

10

您可以使用可選參數

class Sample { 

    int SampleValueX, SampleValueY; 
    string SampleFacing;  

    public Sample(string samplefacing, int samplevaluex = 0, int samplevaluey = 0) 
    { 
    SampleValueX = samplevaluex; 
    SampleValueY = samplevaluey; 
    SampleFacing = samplefacing; 
    } 

} 

注意,可選參數必須是強制性

+0

謝謝@levelnis這正是我所追求的。所以通過在參數中設置一個默認值使它們成爲可選的。 – Anicho

4

這不能工作,因爲你有兩個構造函數具有相同的參數,並且在構造函數中你不能區分一種形式和另一種形式。

與Visual Studio 2008及以後的版本,你可以用object initializer syntax

Sample sampleInstance = new Sample 
    { 
     SampleValueX = 0, 
     SampleValueY = 10, 
     SampleFacing = "MySample" 
    }; 

這初始化對象將刪除需要初始化你的內部成員。
當然,這要求您的內部資產變得公開,但情況並非總是如此。

class Sample 
{ 
    public int SampleValueX {get;set;}; 
    public int SampleValueY {get;set;}; 
    public string SampleFacing {get; set;}; 

    ...... 
+0

謝謝你的網絡4邏輯,這是偉大的 – Anicho

+1

這也是危險的,因爲如果沒有設置屬性,你可以構造缺乏必要信息的對象。 –

2

我個人認爲這樣的邏輯不增加價值,下課後出現。如果類有3個參數,並且你想從構造函數中設置它們,我會在構造函數調用中添加一個帶有3個參數的構造函數,並將其設置爲0。

對於類用戶來說,這種方式會更清楚什麼是類參數值。

+0

可選參數看起來像答案@SoMoS謝謝你的信息 – Anicho

2

我同意可選參數可能是你想要的。替代可能是:

class Sample 
{ 
    int SampleValueX, SampleValueY; 
    string SampleFacing; 

    public Sample(XSetting xSetting) 
    { 
     SampleValueX = xSetting.X; 
     SampleValueY = 0; 
     SampleFacing = xSetting.SampleFacing; 
    } 

    public Sample(YSetting ySetting) 
    { 
     SampleValueX = 0; 
     SampleValueY = ySetting.Y; 
     SampleFacing = ySetting.SampleFacing; 
    } 
} 

public class XSetting 
{ 
    public int X { get; set; } 
    public string SampleFacing { get; set; } 
} 

public class YSetting 
{ 
    public int Y { get; set; } 
    public string SampleFacing { get; set; } 
} 

由於你的代碼示例看起來這可能是矯枉過正。

你的代碼示例不會順便編譯。

+0

謝謝你的好例子。可選參數正是我所追求的。以上對於更復雜的情況是很好的。 – Anicho