我有一堂课。在C#中,是否有某种方法(我可以在静态方法中实现)可以识别此类的一个对象,并由其他(调用)类实例化?如何在C#中识别自己的对象#
场景 其实我有一类国家,它包含一个成员矩形(有4个坐标)。我想写一个静态方法,当它传递一个点或vector2d时,在Country的每个实例化对象中搜索该点,并可以返回该对象的引用。 我有Rectangle.Contains(点)方法,它告诉如果该点位于调用矩形。
我有一堂课。在C#中,是否有某种方法(我可以在静态方法中实现)可以识别此类的一个对象,并由其他(调用)类实例化?如何在C#中识别自己的对象#
场景 其实我有一类国家,它包含一个成员矩形(有4个坐标)。我想写一个静态方法,当它传递一个点或vector2d时,在Country的每个实例化对象中搜索该点,并可以返回该对象的引用。 我有Rectangle.Contains(点)方法,它告诉如果该点位于调用矩形。
您将不得不将所有类的实例存储在一个集合中,并搜索该集合以查找所需的特定对象。
你可能使这个集合成为你的类的静态成员,但它并不需要。它可以作为其他类的普通成员存储在别处。例如,如果您有用于构建Country
对象的CountryFactory
,则每当工厂构建一个国家时,它也可以在该工厂内的一个集合中存储对该国家的引用。
还记得当你不再需要它的时候从收集中移除国家,否则它不会被垃圾收集(或使用WeakReference
)。
这就是我正在做的。我在我的Game类中有一个数组,并循环遍历所有元素,并检查一个点是否包含在其中。但是有没有更好的方法?为什么类没有去了解它自己类型的所有实例化对象(别的地方)? – 2012-03-08 07:31:41
如果某些东西保留了所有构造对象的列表,那么这些对象永远不会有资格进行垃圾回收,因为某些东西总是会引用它们。如果你想要那个功能,那么你必须实现它。 – 2012-03-08 07:34:00
现在明白了。我是否必须关闭这个问题(如何?),或者让它保持原样,因为它是 – 2012-03-08 07:36:37
做到这一点的一种方法是让点具有对其父矩形的引用,然后矩形具有对其父国的引用。然后,静态函数将简单地为:
public Country FindCountry(Point p)
{
return p.Rectangle.Country;
}
当然,如果需要,可能会检查空值等。
为什么它必须是静态方法?
为了解决这个问题,你需要一个所有国家的集合,你可以循环并检查每一个点。你如何保留这个系列取决于你。你可以将它存储在某个对象中。它可以是Country类中的一个静态列表,当新国家使用构造函数创建时,它们被添加到列表中,或者列表可以是一个固定的静态列表,或者它可以在某个创建Country对象的工厂中创建,当它们被创建时存储对它们的引用。这可能取决于目前如何创建您的国家的最佳方案。有一点需要注意的是,保留创建的对象列表时,需要将它们从列表中删除,以便它们可以被垃圾收集,否则它们的内存将永远不会被释放。
您可以在国家/地区传递某个点的方法,并返回它的矩形是否包含该点,或者您可以从该国展示矩形并从外部展示该矩形。
我不知道一个内置的方式来获得一个类的所有对象。
只要使用填充了所有对象的静态字典(或其他集合类型)是我知道的最佳方式。像这样:
private static Dictionary<string /*name*/, Country> _countryDict =
new List<Country>
{
new Country("Country1", new Rectangle(100, 200, 100, 100)),
new Country("Country2", new Rectangle(200, 200, 100, 100))
}.ToDictionary(c => c.Name);
但我想你已经在这个方向上想过了。
听起来像你一样寻找Flyweight模式的转换。你可能想看看。 – 2012-03-08 07:25:04