如何在继承类中使用抽象方法?

How to use abstract methods in inherited classes?

我目前正在做一个周五到期的学校项目,我有很多事情要做。 任务是使用 Monogame 制作带有 XNA 框架的视频游戏。我目前正在处理碰撞。

游戏对象的结构看起来有点像这样:

对于碰撞,我有一个简单的碰撞class

     class Collision{

public GameObject Other;

public GameObject Obj1;

public Collision(GameObject obj1, GameObject other)
{
    Other = other;
    Obj1 = obj1;
}}

碰撞在 GameObject 的静态方法中处理 class:

public static void UpdateCollisions()
{
    //Empty the list
    AllCollisions.Clear();

    for (int a = 0; a < AllGameObjectsWithCollision.Count; a++)
    {
        GameObject obja = AllGameObjectsWithCollision[a];
        for (int b = 0; b < AllGameObjectsWithCollision.Count; b++)
        {
            GameObject objb = AllGameObjectsWithCollision[b];

            if (obja.Mask != null & objb.Mask!= null && obja != objb)
            {
                if (obja.Mask.CollisionRectangle.Intersects(objb.Mask.CollisionRectangle))
                    AllCollisions.Add(new Collision(obja, objb));
            }
        }
    }

}

目前为止一切正常,游戏正在按应有的方式查找所有碰撞。但是现在我需要让我的对象知道它们正在碰撞,并告诉它们该怎么做。 为此,我将实体 class 抽象为能够声明一个名为 "OnCollision(Collision collision)"

的抽象方法

abstract class Entity : GameObject
{
    public float Health;
    public float MaxHealth;
    public bool Alive;
    public float OriginalDmg;
    public float Dmg;

    public abstract void OnCollision(Collision collision);
}

然后我将覆盖 class 中继承实体 class

的方法

例如。射弹

class Projectile : Entity
{
    Entity Owner;
    ProjectileType pType;

    public Projectile(Texture2D image, float maxSpeed, Entity owner, float dmg, ProjectileType type)
    {
        Image = image;
        MaxSpeed = maxSpeed;
        AccelerationSpeed = MaxSpeed;
        Owner = owner;
        Dmg = dmg;
        pType = type;
    }

    public override void OnCollision(Collision collision)
    {
        #region If this projectile friendly
        if (pType == ProjectileType.Friendly)
        {
            //If colliding with an enemy
            if (collision.Other.GetType() == typeof(Enemy))
            {
                var enemy = (Enemy)collision.Other;
                enemy.Health -= Dmg;
                Destroy(this);
            }
        }
        #endregion

        #region If this projectile is hostile
        if (pType == ProjectileType.Hostile)
        {

        }
        #endregion
    }
}

然后我尝试从 GameObject class 中的更新调用 OnCollision 方法。 这就是我尝试通知我的对象他们是否正在碰撞以及他们正在与谁发生碰撞的方式:

        if (GetType().IsAssignableFrom(typeof(Entity)))
        {
            Entity entity = (Entity)this;

            if (GetType() == typeof(Player))
                entity = (Player)this;
            if (GetType() == typeof(Enemy))
                entity = (Enemy)this;
            if (GetType() == typeof(Projectile))
                entity = (Projectile)this;

            var entityCol = FindCollision(entity);

            if (entityCol != null)
                entity.OnCollision(entityCol);
        }

我是抽象 classes 和重写的新手,所以我可能把整个想法都弄错了。 但是似乎没有达到 OnCollision 方法,因为我尝试 Debug.WriteLine 东西但输出中没有显示任何内容 window.

感谢阅读,也许会帮助我 :)

Mediafire link 下载项目以备查看所有代码。

呃,if语句错误...

正在使用

if (GetType().IsSubclassOf(typeof(Entity)))

已修复。

愚蠢的错误,我的错。

您应该阅读 interfaces。接口提供派生 classes 必须实现的契约(一堆方法和属性)。抽象 classes 比接口更具体,因为它们还可以提供用于派生 classes 的基本实现。您只能从一个抽象 class 派生,而您可以从多个接口派生。从您的 post 中的代码看来,您正在使用抽象 class 之类的接口。

您正在使用反射进行类型检查。有用于测试类型兼容性的 is 关键字。例如:

if(entity is Player)
{
    var player = (Player)entity;

    // player specific code
}

终于;从我从您的 post 那里收集到的信息来看,您似乎没有完全正确地使用继承。看起来您正确地使用继承来构建类型层次结构,然后将所有逻辑放在基础 class.

继承是为了让你把专门的逻辑放在适当的地方class。

public interface IGameObject
{
    void OnCollision(IGameObject target);
}

public class Player : IGameObject
{
    public void OnCollision(IGameObject target)
    {
         Console.WriteLine("Player collision");
    }
}

public class Projectile : IGameObject
{
    public void OnCollision(IGameObject target)
    {
         Console.WriteLine("Projectile collision");
    }
}

当我们引用 IGameObject 并调用 OnCollision 时,将自动调用相应的 OnCollision 函数。例如:

IGameObject player = new Player();
IGameObject projectile = new Projectile();

player.OnCollision(projectile);
projectile.OnCollision(player);

输出:

Player collision
Projectile collision