5

我希望我的默认构造函数创建和初始化我的代码片段中显示的所有对象。然后我希望我的参数化构造函数调用默认构造函数,从而创建和初始化这些对象,然后可以在参数化构造函数中使用这些对象,而不会出现 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

4 回答 4

19

我刚刚添加

: this()

在参数化构造函数之后。这有点猜测,但它似乎有效。

于 2014-02-07T09:44:38.287 回答
3

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

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

所以,假设 Line 需要两个点作为参数,我会这样做:

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)
          )
      ) 
{ }
于 2009-12-02T05:01:43.290 回答
3

通常,当您链接构造函数时,情况正好相反:默认构造函数使用默认值调用更具体的构造函数。假设您有一个 Point 构造函数,它采用 x 和 y 坐标。然后你有默认的 Point 构造函数用 x = 0 和 y = 0 调用另一个。这样你只需要编写代码来设置一次值。

以下是您可以在代码中改进的一些内容:

  1. 您初始化beginningDiagonalPointendingDiagonalPoint到新点,然后用对diagnonal.startPoint和的引用覆盖它们diagnonal.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);
    
于 2009-12-02T05:05:51.583 回答
1

您的示例几乎可以满足您的要求。但是,按照您的做法,它是调用参数化构造函数的默认构造函数,并为其提供了一个默认参数来使用。这样做没有错,只是不是你说的你要找的。

此外,公共属性通常以大写字母开头(Left, Right, Top,Bottom而不是left, right, top, bottom)。请注意,所有 .NET 库类都是这样做的。

于 2009-12-02T05:00:11.313 回答