将对象强制转换为抽象类和接口

本文关键字:抽象类 接口 转换 对象 | 更新日期: 2023-09-27 18:27:54

我正在尝试用C#制作一个游戏。到目前为止,第一次看到我的一些代码:

我的抽象类gridobject

它包含了我的网格对象(墙、玩家、敌人等)的所有一般属性

abstract class GridObject
{
    public Rectangle Rect;
    ...
    //all kind of getters and setters for location and size: X, Y, Height, Width
    ...
}

界面移动

此接口包含移动网格对象的属性:

interface Moving
{
    int Xspeed { get; set; }
    int Yspeed { get; set; }
    void Move();
}

现在我想给我的游戏增加重力:

public void doGravity(GridObject obj)
    {
        //check if intersects && if object isn't the same as the given object.
        while (AllGridObjects.FindAll(item => item.Rect.IntersectsWith(obj.Rect) && item != obj).Count > 0)
        {
            obj.Y += obj.Yspeed;
            obj.Yspeed++;
        }
    }

这当然会产生编译错误。因为Yspeed不是抽象类GridObject中的必需字段。也许标题不正确,也许也是我的问题,但我如何将对象强制转换为抽象类和接口,以确保需要属性Y和属性Yspeed?正确的方法是什么?

将对象强制转换为抽象类和接口

在设置值之前将其转换为所需的类型。

if(obj is Moving)
{
    var objectAsMoving = obj as Moving; //or (Moving)obj;
    objectAsMoving.Y += objectAsMoving.Yspeed;
    objectAsMoving.Yspeed++;
}

感谢DLeh,我找到了解决方案。我正在使用一个额外的抽象类MovingGridObject,它继承自GridObjectMoving。这就是我要在doGravity方法中使用的类型。