Вызов конструктора по умолчанию из параметризованного конструктора
Я хотел бы, чтобы мой конструктор по умолчанию создавал и инициализировал все объекты, показанные в моем фрагменте кода. Затем я хотел бы, чтобы мой параметризованный конструктор вызывал конструктор по умолчанию, создавая и инициализируя эти объекты, которые затем можно использовать в параметризованном конструкторе без получения исключения 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 ответа
Обычно, когда вы связываете конструкторы, все наоборот: конструктор по умолчанию вызывает более конкретные конструкторы со значениями по умолчанию. Скажем, у вас есть конструктор 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);
Я только добавил
: this()
после параметризованного конструктора. Было немного догадок, но, похоже, это сработало.
Ваш параматеризованный конструктор уже инициализирует все ваши свойства. Итак, я думаю, что все, что вам нужно сделать, это передать какое-то значение по умолчанию в параматизированный конструктор из вашего конструктора по умолчанию.
Вам нужно ответить на этот вопрос самостоятельно: что такое прямоугольник по умолчанию или пустой прямоугольник? Я собираюсь предположить, что это нулевой размер.
Итак, предполагая, что Линия принимает две точки в качестве параметров, я бы сделал это:
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)
)
)
{ }
Ваш пример почти делает то, что вы просите. Однако, как вы это сделали, это конструктор по умолчанию, который вызывает параметризованный конструктор, предоставляя ему параметр по умолчанию для работы. В этом нет ничего плохого, просто это не то, что вы сказали, что искали.
Кроме того, общедоступные свойства принято начинать с заглавных букв (Left
, Right
, Top
, Bottom
вместо left
, right
, top
, bottom
). Обратите внимание, что все классы библиотеки.NET делают это таким образом.