从c#中继承结构的梦想

Few*_*fre 6 c# inheritance xna struct xna-4.0

在那里,我在C#XNA 4.0中制作2D游戏,并再次遇到我的小烦恼; 该矩形.对于那些使用基本碰撞的人来说,这几乎是必需的.对于几乎所有创建的游戏对象,您都需要有一个矩形.然后我去改变X,检查碰撞或其他任何东西.在那里,我开始了永无止境的战斗objectName.Rectangle.Whatever.为了解决这个问题,我当然会给出一些objectName属性/方法来为我访问这些属性/方法.

然后我敢于梦想.我有一个伟大的设计来制作一个基本的游戏对象类,所有drawable将继承,这将允许父母,精确的本地坐标(浮点数),并保持纹理/ spritebatch.为了完成这个,我准备从Rectangle继承,使用它拥有的所有方法和属性.哎呀,每当需要一个Rectangle的东西时,我可能会懒得说objectName,而不是objectName.Rectangle.

然后我意识到,不是机会.我开始感到沮丧,因为我很聪明的想法被砸碎了.从那时起,我完美的小班级拥有一个矩形,各种方法和属性根据需要访问它.我也有机会从XNA DrawableGameComponent继承它.虽然从长远来看这更实用,每次我查看绘制或更新方法并看到我经常想到的矩形调用时,是否有希望做我想要的事情?我可以做一些聪明的工作吗?或者是从一个真正被我掌握的矩形继承而来?

虽然使用XNA中提供的DrawableGameComponent类允许大多数与游戏对象相关的动作发生在类Update()方法中,但每次在类之外我需要引用的不是Rectangle的属性,而是Rectangle本身,我稍微考虑到实际上我的对象实际上是各种各样的方式,并且加强了Rectangle.然后我再一次发现自己在问:

有没有办法从预定义的结构继承,或者给项目留下你的印象(一种解决方法)?

Me.*_*ame 16

继承否,但您可以使用扩展方法向Rectangle对象添加许多"默认"功能.例如

  //(inside a static class)
  public static int GetSurface(this Rectangle rect){return rect.Width * rect.Height;}

  //calling
  Rectangle rect;
  var s = rect.GetSurface();
Run Code Online (Sandbox Code Playgroud)

也就是说,我通常做的是封装所述结构.使用该类作为基础对象,并添加一个运算符,以便可以将其隐式转换为Rectangle.这样它就可以传递给一个需要一个矩形而不需要强制转换的方法.

    public class MyRect //class so you can inherit from it, but you could make your own struct as well
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
        public int Right { get { return X + Width; } }
        public int Bottom{ get { return Y + Height; } }

        public static implicit operator Rectangle(MyRect rect)
        {
            return new Rectangle(rect.X, rect.Y, rect.Width, rect.Height);
        }

        public static implicit operator MyRect(Rectangle rect)
        {
            return new MyRect { X = rect.X, Y = rect.Y, Width = rect.Width, Height = rect.Height };
        }

    }       
 }
Run Code Online (Sandbox Code Playgroud)

现在,您可以手动或从现有的rect创建自己的rect:

  MyRect rect = ARectangleVar
Run Code Online (Sandbox Code Playgroud)

并且您可以在遗留方法中使用它,这些方法期望不转换矩形

  • @Kyomu - 根据Me.Name所说的扩展方法,你可以声明一个名为IRectangle的接口,它带有一个返回矩形结构的单一属性Rectangle.您可以创建其他具有矩形作为其字段之一的结构,并让它们实现IRectangle并具有该单个属性.然后你可以在IRectangle上编写一堆扩展方法(例如:public static int GetSurface(这个IRectangle rect,...),所有这些结构都会得到那种行为.接口上的扩展方法非常方便. (2认同)