Вызов конструктора по умолчанию из параметризованного конструктора - PullRequest
2 голосов
/ 02 декабря 2009

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

12 голосов
/ 07 февраля 2014

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

: this()

после параметризованного конструктора. Было немного догадок, но, похоже, это сработало.

3 голосов
/ 02 декабря 2009

Ваш параматеризованный конструктор уже инициализирует все ваши свойства. Итак, я думаю, все, что вам нужно сделать, это передать какое-то значение по умолчанию в параматизированный конструктор из вашего конструктора по умолчанию.

Вам нужно ответить на этот вопрос самостоятельно: что такое прямоугольник по умолчанию или пустой прямоугольник? Я собираюсь предположить, что это нулевой размер.

Итак, предположив, что Линия принимает две точки в качестве параметров, я бы сделал это:

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 голосов
/ 02 декабря 2009

Обычно, когда вы связываете конструкторы, все наоборот: конструктор по умолчанию вызывает более конкретные конструкторы со значениями по умолчанию. Скажем, у вас есть конструктор 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);
    
1 голос
/ 02 декабря 2009

Ваш пример почти делает то, что вы просите. Однако, как вы это сделали, это конструктор по умолчанию, который вызывает параметризованный конструктор, давая ему параметр по умолчанию для работы. В этом нет ничего плохого, просто это не то, что вы сказали, что искали.

Также общедоступные свойства принято начинать с заглавных букв (Left, Right, Top, Bottom вместо left, right, top, bottom). Обратите внимание, что все классы библиотеки .NET делают это таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...