2009-12-02 244 views
1

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

回答

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

你的例子差不多就是你所要求的。但是,你已经完成了这个工作,它是默认的构造函数,它调用参数化构造函数,给它一个默认参数。这样做没有任何问题,这不是你说的你想要的。

此外,它是常规的公共属性与大写字母开头(LeftRightTopBottom代替leftrighttopbottom)。注意,所有的.NET库类都是这样做的。

3

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

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

因此,假设线路需要两个点作为参数,我应该这样做:

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

的参数化的构造后,我刚添加

: this() 

。这是一个猜测,但它似乎工作。

+0

那简直太棒了 – Mitz 2016-12-15 13:40:45

+1

不幸的是,它似乎在自定义构造函数执行任何代码之前调用基构造函数 – Lara 2017-02-11 07:56:35