Вызов конструктора по умолчанию из параметризованного конструктора

Я хотел бы, чтобы мой конструктор по умолчанию создавал и инициализировал все объекты, показанные в моем фрагменте кода. Затем я хотел бы, чтобы мой параметризованный конструктор вызывал конструктор по умолчанию, создавая и инициализируя эти объекты, которые затем можно использовать в параметризованном конструкторе без получения исключения 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. Таким образом, вам нужно всего лишь написать код для установки значений один раз.

Вот некоторые вещи, которые вы можете улучшить в своем коде:

  1. Вы инициализируете beginningDiagonalPoint а также endingDiagonalPoint к новым точкам, а затем перезаписать их со ссылками на 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);
    

Я только добавил

: 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 делают это таким образом.

Другие вопросы по тегам