从参数化构造函数调用默认构造函数

时间:2009-12-02 04:52:13

标签: c# constructor constructor-chaining

我希望我的默认构造函数能够创建&初始化我的代码段中显示的所有对象。然后我希望我的参数化构造函数调用默认构造函数,从而创建并初始化这些对象,然后可以在参数化构造函数中使用它们而不会得到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;
    }
}

4 个答案:

答案 0 :(得分:12)

我刚刚添加了

: this()

在参数化构造函数之后。这是一个猜测,但似乎有效。

答案 1 :(得分:3)

您的参数化构造函数已经初始化了您的所有属性。所以,我认为您需要做的就是从默认构造函数中将某种默认值传递给paramaterised构造函数。

你需要自己回答这个问题:什么是默认或空矩形?我将假设它是一个零大小的。

因此,假设一条线作为参数取两点,我会这样做:

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)
          )
      ) 
{ }

答案 2 :(得分: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);
    

答案 3 :(得分:1)

你的榜样几乎可以满足你的要求。但是,你完成它的方式是调用paramaterized构造函数的默认构造函数,为它提供一个默认参数。这样做是没有错的,这不是你所说的你想要的。

此外,公共财产的常规用大写字母开头(LeftRightTopBottom代替left,{{1 },righttop)。请注意,所有.NET库类都是这样做的。