0

作为介绍,我正在为个人学习目的创建一个基本的四叉树引擎。我希望这个引擎能够处理许多不同类型的形状(目前我正在使用圆形和正方形),它们都将在窗口中移动并在发生碰撞时执行某种动作。

在之前就泛型列表主题提出问题后,我决定使用多态接口。最好的接口将是一个接口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();
}

所以我的问题有两个部分

1.为什么这段代码在我的和类的set { position = value; }部分给我一个stackoverflow错误?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 回答