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

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

22

我刚刚添加了

: this()

在参数化构造函数之后。这有点猜测,但似乎可以工作。


那真是太棒了。 - Mitz
4
很遗憾,似乎在执行自定义构造函数的任何代码之前,需要先调用基础构造函数。 - user1908746
不要称其为基础构造函数,因为使用 : base() 不会调用无参构造函数(如果继承了该类,则会调用基类的构造函数)。是的,这就是预期的行为 - 如果这不是您想要的,则说明您初始化不正确。 - Piotr Kula

3

你的参数化构造函数已经初始化了所有属性。所以,我认为你只需要从默认构造函数中传递一些默认值到参数化构造函数中。

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

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

public Rectangle() : this(new Line(new Point(0,0), new Point(0,0))) { }

And in a less condensed format:

public Rectangle() 
    : this(
          new Line(
              new Point(0,0), 
              new Point(0,0)
          )
      ) 
{ }

3
通常情况下,当你链接构造函数时,是反过来的:默认构造函数使用默认值调用更具体的构造函数。比如说,你有一个接受x和y坐标的Point构造函数。然后你可以让默认的Point构造函数使用x=0和y=0调用另一个构造函数。这样你只需要编写一次设置值的代码。
以下是你的代码中可以改进的几点:
  1. You initialize beginningDiagonalPoint and endingDiagonalPoint to new points and then you overwrite them with references to diagnonal.startPoint and diagnonal.endPoint. You are creating two new points and then discarding them. You don't need to create those new points.

  2. You create new Points and new Lines with the default constructor and then manually set their fields. You could create a point constructor that receives the two coordinates and sets them, and a line constructor that receives the two end points and sets them. Your code would look like this:

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

1

你的示例几乎实现了你所要求的功能。不过,你的做法是默认构造函数调用参数化构造函数,并给它一个默认参数来使用。这种做法没有问题,只是不符合你所说的需求。

此外,公共属性通常以大写字母开头(例如LeftRightTopBottom,而不是leftrighttopbottom)。请注意,所有的.NET库类都是这样做的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接