子类成员初始化

时间:2014-12-23 13:37:28

标签: c# initialization subclass member

我已经创建了两个类来替换Point(两个变体)的功能,只是为了测试它们,这就是我创建它们的方式:

Entity.cs:

namespace Xnagame
{

    class Player
    {

        public class float2
        {
            public float X { get; set; }
            public float Y { get; set; }
        }
        public class int2
        {
            public int X { get; set; }
            public int Y { get; set; }
        }
        public int2 Position { get; set; }
        public int angle { get; set; }
        public float speed { get; set; }
        public float2 velocity { get; set; }

        public Player CreatePlayer()
        {

            Position = new Player.int2();
            Player player = new Player();
            return player;
        }
    }
}

正如您所看到的,两个Point类都有XY变量(我不确定这是否是设置它们的方法,如果它不是't}请告诉我)这些类用于CreatePlayer()方法中实例化的位置和速度实例。

Game1.cs:

namespace Xnagame
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private Texture2D playerimage;
        private Texture2D background;
        Player player = Player.CreatePlayer();

现在的问题是,当CreatePlayer()方法尝试返回时,"播放器"它给了本地玩家:

  

非静态字段,方法或属性Xnagame.Player.CreatePlayer()

需要对象引用

错误。

我也尝试使用new关键字,它给了我:

  

Xnagame.Player.CreatePlayer()是一种方法,但用作类型。

3 个答案:

答案 0 :(得分:2)

您的CreatePlayer方法是实例方法 - 换句话说,它必须在现有实例上调用。你可能想把它变成静态的:

public static Player CreatePlayer()

然后你应该删除Position = new Player.int2()行 - 创建一个玩家不应该改变现有玩家的位置。

(我还强烈建议将嵌套类型提取为不可变的顶级结构,并将它们重命名为Int32PositionSinglePosition - 尽管您可能会发现框架已经有类似的东西了。您还应该使所有属性都遵循.NET命名约定。)

答案 1 :(得分:1)

您需要使用静态函数直接从类

这样的类调用
public static Player CreatePlayer()
{
     //all the code
}

答案 2 :(得分:0)

问题是您正在使用实例方法来创建实例。

您有两种选择:

1)使用默认构造函数

class Player
{
    // Other subclasses, and properties.

    public Player()
    {
        // Note: I added the other instance value just for fun.
        Position = new Player.int2();
        velocity = new Player.float2();
    }
}

2)使用静态构造函数方法。 (这些通常仅用于singleton pattern。)

class Player
{
    // Other subclasses, and properties.

    public static Player CreatePlayer()
    {
        // Note how I created the instance variables for the player class,
        // and I used a notation called "object initalizer" to set those properties
        // when I create the Player instance.
        var p = new Player.int2();
        var v = new Player.float2();
        Player player = new Player()
        {
          velocity = v,
          Position = p
        };
        return player;
    }
}