C# 扩展类以使其可浇铸
我想扩展一个类(Vector2),使其在某个点上可浇铸。 我该怎么做 部分问题:C# 扩展类以使其可浇铸,c#,xna,C#,Xna,我想扩展一个类(Vector2),使其在某个点上可浇铸。 我该怎么做 部分问题: 扩展类 使一个班级可以被另一个班级铸造 最后,我希望能够做到这一点: Vector2 foo = new Vector2(5.2f); // X = 5.2f Y = 5.2F Point red = new Point(2,2); // X = 2 Y = 2 red = foo; // I know that you can make classes convert themselves automati
Vector2 foo = new Vector2(5.2f); // X = 5.2f Y = 5.2F
Point red = new Point(2,2); // X = 2 Y = 2
red = foo; // I know that you can make classes convert themselves automatically... somehow?
// Now red.X = 5 red.Y = 5
你不能那样做
是一个,不是一个。正如您所知,它不可能从中派生,因为结构在堆栈上分配固定的大小。所以多态性是不可能的,因为派生的将有不同的大小
作为一种解决方法,您可以创建将返回struct实例的ToPoint
:
注意:这种方法比隐式地将向量转换为点更直观,因为向量不是点。隐式强制转换在这些类型之间没有任何意义。实际上,隐式转换非常有用的情况很少。你不能这样做
是一个,不是一个。正如您所知,它不可能从中派生,因为结构在堆栈上分配固定的大小。所以多态性是不可能的,因为派生的将有不同的大小
作为一种解决方法,您可以创建将返回struct实例的ToPoint
:
注意:这种方法比隐式地将向量转换为点更直观,因为向量不是点。隐式强制转换在这些类型之间没有任何意义。实际上,隐式转换非常有用的情况很少。这正是我在XNA项目中使用的方法。@user1306322是的,这样更好。如果将来
Point
将更改为另一个结构,则无需修改整个项目并重构所有新点(…)
实例。我还发现这更具可读性。这正是我在XNA项目中使用的。@user1306322是的,这样更好。如果将来Point
将更改为另一个结构,则无需修改整个项目并重构所有新点(…)
实例。我也觉得这更具可读性。
public static class Extensions {
public static void ToPoint(this Vector2 vector) {
return new Point((int)vector.X, (int)vector.Y);
}
}
//Usage:
Vector2 foo = new Vector2(5.2f);//X = 5.2f Y = 5.2F
Point red = foo.ToPoint();