【问题标题】:Constructor overloads and class parameters构造函数重载和类参数
【发布时间】:2012-11-30 03:09:36
【问题描述】:

有没有更好的方法来做我正在做的事情:

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;
}
}

这甚至被称为构造函数重载吗?如果我错了,请纠正我。

【问题讨论】:

  • 当您在方法(或 ctor)上具有相同顺序的参数类型时,它将不允许您编译。
  • 呃...相同的构造函数(参数类型)但不同的逻辑?更好地使用具有适当名称(createX、createYSample)的静态函数,并赋予构造函数设置所有 3 个成员的权力
  • 签名需要不同,因为你的签名是 Sample(int, string) ,所以你所拥有的将不起作用
  • @Najzero 你能扩展给构造函数设置所有 3 个成员的权力吗?
  • @Anicho 看到 levelnis 的答案。当您实例化一个对象时,只需传递您想要的值(x/y 或两者)。

标签: c# oop constructor


【解决方案1】:

这不起作用,因为您有两个具有相同参数的构造函数,并且在构造函数内部您无法区分一种形式和另一种形式。

使用 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;};

    ......

【讨论】:

  • 这也很危险,因为如果没有设置属性,您可以构建缺少基本信息的对象。
【解决方案2】:

你可以使用可选参数

class Sample {

  int SampleValueX, SampleValueY;
  string SampleFacing;    

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

}

注意可选参数必须出现在强制参数之后

【讨论】:

  • 谢谢@levelnis,这正是我所追求的。因此,通过在参数中设置默认值使它们成为可选的。
【解决方案3】:

以我的拙见,这种逻辑不会为课程增加价值。如果该类有 3 个参数并且您想从构造函数中设置它们,我将添加一个带有 3 个参数的构造函数,并将构造函数调用所需的参数设置为 0。

这样会让类用户更清楚类参数值是什么。

【讨论】:

  • 可选参数似乎是答案@SoMoS 感谢您提供信息
【解决方案4】:

我同意可选参数可能是您想要的。另一种可能是:

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; }
}

正如您的代码示例看起来这可能是矫枉过正。

顺便说一句,您的代码示例不会编译。

【讨论】:

  • 谢谢你的好例子。可选参数正是我所追求的。以上适用于更复杂的情况。
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多