如何制作正确的抽象实体类

时间:2015-09-06 00:53:16

标签: c# .net xna

我正在寻找一个抽象类Entity,然后它有很少的类,如Enemy,Friendly和Player。我这样做的原因是因为类有很多相似的属性/字段。我还有两种方法:updateEntitydrawEntity。我有更新和绘制实体的原因是drawEntity& updateEntity对于从中继承的大多数类都是相同的。这是我的实体类的代码:

public abstract class Entity
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private Texture2D texture;

    public Texture2D Texture
    {
        get { return texture; }
        set { texture = value; }
    }

    private Vector2 position;

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

    private int health;

    public int Health
    {
        get { return health; }
        set { health = value; }
    }

    private Color entColor;

    public Color EntColor
    {
        get { return entColor; }
        set { entColor = value; }
    }

    public Entity(string name, Texture2D texture, Vector2 position, int health, Color entColor)
    {
        this.name = name;
        this.texture = texture;
        this.position = position;
        this.health = health;
        this.entColor = entColor;
    }

    public virtual void updateEntity(GameTime gameTime)
    {
        //update stuff here
    }

    public virtual void drawEntity(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height), entColor);
    }
}

这就是我设想敌人课程的方式:

public Enemy(string name, Texture2D texture, Vector2 position, int health, Color entColor)
{
    Name = name;
    Texture = texture;
    Position = position;
    Health = health;
    EntColor = entColor;
}

有人能告诉我这是否很好地利用了抽象类,或者我是否在游戏设计/架构方面做了一些完全错误的事情?

1 个答案:

答案 0 :(得分:1)

您通常在其实现未完成时使用抽象类,但它包含从其派生的其他类型常见的属性和/或方法,或者它提供应由派生类型共享的接口但是不能在这个抽象杠杆上实现,因此不可能实例化它。

这样的示例可以是抽象类Fruit,其具有Color属性,该属性对于所有水果都是通用的,并且不必由它们中的每一个实现。它也可以有一个没有实现的方法Grow()。仅此类没有意义。您需要实现类似Apple类型的具体水果,并为此特定水果实施Grow()方法。

在你的情况下,Entity将是一个水果,苹果可以是一个矩形或圆形,实现自己的绘图逻辑。

基础实体:

public abstract class Entity
{
    public abstract void Draw(); // no implementation here

    public virtual void UpdateEntity(GameTime gameTime)
    {
        // default update
    }
}

矩形:

public class Rectangle : Entity
{
    public override void Draw()
    {
        // draw a rectangle here
    }
}

使用UpdateEntity的不同逻辑的圆圈:

public class Circle : Entity
{
    public override void Draw()
    {
        // draw a circle here
    }

    public override void UpdateEntity(GameTime gameTime)
    {
        // custom update for circles
    }
}