5

デフォルトのコンストラクターで、コード スニペットに示されているすべてのオブジェクトを作成および初期化したいと考えています。次に、パラメーター化されたコンストラクターがデフォルトのコンストラクターを呼び出して、これらのオブジェクトを作成および初期化し、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

4 に答える 4

19

ちょうど追加しました

: this()

パラメーター化されたコンストラクターの後。少し推測でしたが、うまくいくようです。

于 2014-02-07T09:44:38.287 に答える
3

パラメータ化されたコンストラクターは、すべてのプロパティを既に初期化しています。したがって、デフォルトのコンストラクターからパラメーター化されたコンストラクターに何らかのデフォルトを渡すだけでよいと思います。

この質問に自分で答える必要があります: デフォルトまたは空の Rectangle とは何ですか? 私はそれがゼロサイズのものであると仮定するつもりです。

したがって、 Line がパラメーターとして 2 つのポイントを取ると仮定すると、次のようになります。

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)
          )
      ) 
{ }
于 2009-12-02T05:01:43.290 に答える
3

通常、コンストラクターをチェーンする場合は逆になります。デフォルトのコンストラクターは、デフォルト値を使用してより具体的なコンストラクターを呼び出します。x 座標と y 座標を取る Point コンストラクターがあるとします。次に、デフォルトの Point コンストラクターに、x = 0 および y = 0 で別のコンストラクターを呼び出します。この方法では、値を設定するコードを 1 回記述するだけで済みます。

コードで改善できる点は次のとおりです。

  1. beginningDiagonalPointとを新しいポイントに初期化し、とendingDiagonalPointへの参照でそれらを上書きします。2 つの新しいポイントを作成し、それらを破棄しています。これらの新しいポイントを作成する必要はありません。diagnonal.startPointdiagnonal.endPoint

  2. デフォルトのコンストラクターを使用して新しいポイントと新しいラインを作成し、それらのフィールドを手動で設定します。2 つの座標を受け取って設定するポイント コンストラクターと、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);
    
于 2009-12-02T05:05:51.583 に答える
1

あなたの例は、あなたが求めていることをほぼ実行します。ただし、あなたが行った方法では、パラメータ化されたコンストラクターを呼び出すのはデフォルトのコンストラクターであり、動作するデフォルトのパラメーターを与えます。このようにすることに問題はありません。それは、あなたが探していると言ったものではありません。

また、パブリック プロパティは大文字で始めるのが一般的です ( Left, Right,TopBottom代わりに, left, right) 。すべての .NET ライブラリ クラスがこの方法で行うことに注意してください。topbottom

于 2009-12-02T05:00:11.313 に答える