2012-07-06 62 views
0

通過介紹,我爲個人學習目的創建了一個基本的Quadtree引擎。我希望這個引擎能夠處理許多不同類型的形狀(當前我正在用圓形和正方形),這些形狀都會在窗口中移動,並在碰撞發生時執行某種動作。在C#中使用多態的接口#

之前詢問了關於泛型列表主題的問題之後,我決定使用多態的接口。最好的界面是使用Vector2的界面,因爲我的四叉樹中出現的每個對象都會有一個x,y的位置並很好地覆蓋。這裏是我的代碼,因爲它目前爲:

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(); 
} 

所以我的問題有兩部分

1.爲什麼這段代碼在我的QCircleQSquare類的set { position = value; }部分給我一個計算錯誤?

2.這是一種利用多態性接口的高效/有效方式嗎?

+0

你又來了! Hehe = p – Pete 2012-07-06 04:53:53

+0

我可以說什麼,我似乎無法離開:P – Djentleman 2012-07-06 10:44:54

回答

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 

關於使用多態的,似乎就在這種情況下。

+0

選擇這個答案,因爲你涵蓋了我的兩個問題。謝謝 :) – Djentleman 2012-07-06 09:25:11

6

的問題是在你的財產是自己設定的圓形環

public Vector2 position { get ; set ; } 

或聲明私有字段

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