我的课程中有一个Rectangle
属性,我想正确地接受Width
和Height
,并返回它们,好像我正在处理正常情况一样Rectangle
。
Vector2 position;
Rectangle rectangle;
public Rectangle Rect
{
get { return rectangle; }
set { rectangle = value; position.X = value.X; position.Y = value.Y; }
}
看起来很好,效果很好。除非您希望专门获取或设置Width
或X
。
我该如何做到这一点?
答案 0 :(得分:2)
如果您的班级的语义是这样的,您可以百分之百地确定当外人调整Rect
时您永远不会关心,只需将其公开为一个字段,并且调用者将能够设置其字段直。如果您无法做出这种保证,那么您可以考虑提供一种将rectangle
传递给回调方法的方法:
delegate void ActionByRef<T1>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2,T3>(ref T1 p1, ref T2 p2, ref T3 p3);
void ActOnRect(ActionByRef<Rectangle> proc)
{ proc(ref rectangle); position.X = value.X; position.Y = value.Y; }
void ActOnRect<TP1>(ActionByRef<Rectangle,TP1> proc, ref TP1 p1)
{ proc(ref rectangle, ref p1); position.X = value.X; position.Y = value.Y; }
void ActOnRect<TP1,TP2>(ActionByRef<Rectangle,TP1> proc, ref TP1 p1, ref TP2 p2)
{ proc(ref rectangle, ref p1, ref p2); position.X = value.X; position.Y = value.Y; }
这种方法可以避免任何人只需更改其中一个成员而复制rectangle
。使用16字节结构可能不值得,但如果需要更大的结构,也许值得。
第三种方法是简单地要求您的呼叫者执行以下操作:
var r = myThing.Rect;
r.X = 23;
myThing.Rect = r; // Or perhaps myThing.SetRect(R);
我建议的最后一种方法是遵循Control.SetBounds
的模式,其中包括将Rectangle
成员作为单独参数的重载,但是需要一个额外的参数来指定哪个参数或应将参数复制到Bounds
的相应成员。