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)
并且您可以在遗留方法中使用它,这些方法期望不转换矩形