0

紹介として、私は個人的な学習目的で基本的な Quadtree エンジンを作成しています。このエンジンには、さまざまな種類の形状 (現在は円と四角形を使用しています) を処理する機能を持たせたいと考えています。これらの形状はすべてウィンドウ内を移動し、衝突が発生したときに何らかのアクションを実行します。

以前にジェネリック リストのトピックについて質問した後、ポリモーフィズムにインターフェイスを使用することにしました。これに最適なインターフェイスVector2は、クアッドツリーに表示されるすべてのオブジェクトが x、y 位置を持ち、Vector2それをうまくカバーするという事実のために利用するインターフェイスです。現在の私のコードは次のとおりです。

public interface ISpatialNode {
    Vector2 position { get; set; }
}

public class QShape {
    public string colour { get; set; }
}

public class QCircle : QShape, ISpatialNode {
    public int radius;
    public Vector2 position {
        get { return position; }
        set { position = value; }
    }
    public QCircle(int theRadius, float theX, float theY, string theColour) {
        this.radius = theRadius;
        this.position = new Vector2(theX, theY);
        this.colour = theColour;
    }
}

public class QSquare : QShape, ISpatialNode {
    public int sideLength;
    public Vector2 position {
        get { return position; }
        set { position = value; }
    }
    public QSquare(int theSideLength, float theX, float theY, string theColour) {
        this.sideLength = theSideLength;
        this.position = new Vector2(theX, theY);
        this.colour = theColour;
    }
}

したがって、最終的には、汎用リストを使用できるようになり、コードまたはその行に沿って何かList<ISpatialNode> QObjectList = new List<ISpatialNode>();を使用して形状を追加できるように機能するインターフェイスが必要になります (私がしたいことを覚えておいてください)線に沿って後で別の形状を追加します)。QObjectList.Add(new QCircle(50, 400, 300, "Red"));QObjectList.Add(new QSquare(100, 400, 300, "Blue"));

問題は、ここから呼び出すと、このコードが機能しないように見えることです (Initialize()は XNA メソッドです)。

protected override void Initialize() {
    QObjectList.Add(new QCircle(5, 10, 10, "Red"));

    base.Initialize();
}

だから私の質問には2つの部分があります:

1.このコードを実行すると、my クラスとクラスのset { position = value; }一部でスタック オーバーフロー エラーが発生するのはなぜですか?QCircleQSquare

2.これは、ポリモーフィズムのためにインターフェースを利用する効率的/効果的な方法ですか?

4

2 に答える 2

6

問題はあなたのプロパティにあり、それ自体が循環ループに設定されています

public Vector2 position { get ; set ; }

またはプライベートフィールドを宣言する

private Vector2 _position;
public Vector2 position {
    get { return _position; }
    set { _position = value; }
}
于 2012-07-06T04:48:42.420 に答える
4

スタック オーバーフローの原因は次のとおりです。

public Vector2 position {
    get { return position; }
    set { position = value; }
}

セットは実際には同じものを再び設定します。あなたはこれが欲しいかもしれません:

private Vector2 _position;
public Vector2 position {
    get { return _position; }
    set { _position = value; }
}

またはその短いバージョン:

public Vector2 position { get; set; } //BTW, the c# standard is to use upper camel case property names

ポリモーフィズムの使用に関しては、このシナリオでは正しいようです。

于 2012-07-06T04:48:55.177 に答える