利用C#中的多态接口

时间:2012-07-06 04:44:58

标签: c# interface polymorphism stack-overflow quadtree

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

之前询问有关通用列表主题的问题后,我决定使用多态性接口。最好的接口是使用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"));或{{1}为其添加形状或者那些沿着这些线的东西(请记住,我希望稍后沿着这条线添加不同的形状)。

问题是,当我从这里调用它时,这段代码似乎不起作用(QObjectList.Add(new QSquare(100, 400, 300, "Blue"));是XNA方法):

Initialize()

所以我的问题有两部分

1。为什么此代码在protected override void Initialize() { QObjectList.Add(new QCircle(5, 10, 10, "Red")); base.Initialize(); } set { position = value; }类的QCircle部分给出了堆栈溢出错误?

2. 这是一种有效/有效的利用接口的方式     多态性?

2 个答案:

答案 0 :(得分:6)

问题在于你的属性它是在循环循环中设置自己

public Vector2 position { get ; set ; }

或声明私人字段

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

答案 1 :(得分: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

关于多态的使用,在这种情况下似乎是正确的。