我希望我的默认构造函数能够创建&初始化我的代码段中显示的所有对象。然后我希望我的参数化构造函数调用默认构造函数,从而创建并初始化这些对象,然后可以在参数化构造函数中使用它们而不会得到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;
}
}
答案 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的另一个。这样你只需编写代码来设置值一次。
以下是您可以在代码中改进的一些内容:
您将beginningDiagonalPoint
和endingDiagonalPoint
初始化为新点,然后使用对diagnonal.startPoint
和diagnonal.endPoint
的引用覆盖它们。您正在创建两个新点然后丢弃它们。您无需创建这些新点。
使用默认构造函数创建新点和新行,然后手动设置其字段。您可以创建一个接收两个坐标并设置它们的点构造函数,以及一个接收两个端点并设置它们的线构造函数。你的代码看起来像这样:
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构造函数的默认构造函数,为它提供一个默认参数。这样做是没有错的,这不是你所说的你想要的。
此外,公共财产的常规用大写字母开头(Left
,Right
,Top
,Bottom
代替left
,{{1 },right
,top
)。请注意,所有.NET库类都是这样做的。