2012-03-08 66 views
1

我有一堂课。在C#中,是否有某种方法(我可以在静态方法中实现)可以识别此类的一个对象,并由其他(调用)类实例化?如何在C#中识别自己的对象#

场景 其实我有一类国家,它包含一个成员矩形(有4个坐标)。我想写一个静态方法,当它传递一个点或vector2d时,在Country的每个实例化对象中搜索该点,并可以返回该对象的引用。 我有Rectangle.Contains(点)方法,它告诉如果该点位于调用矩形。

+0

听起来像你一样寻找Flyweight模式的转换。你可能想看看。 – 2012-03-08 07:25:04

回答

2

您将不得不将所有类的实例存储在一个集合中,并搜索该集合以查找所需的特定对象。

可能使这个集合成为你的类的静态成员,但它并不需要。它可以作为其他类的普通成员存储在别处。例如,如果您有用于构建Country对象的CountryFactory,则每当工厂构建一个国家时,它也可以在该工厂内的一个集合中存储对该国家的引用。

还记得当你不再需要它的时候从收集中移除国家,否则它不会被垃圾收集(或使用WeakReference)。

+0

这就是我正在做的。我在我的Game类中有一个数组,并循环遍历所有元素,并检查一个点是否包含在其中。但是有没有更好的方法?为什么类没有去了解它自己类型的所有实例化对象(别的地方)? – 2012-03-08 07:31:41

+0

如果某些东西保留了所有构造对象的列表,那么这些对象永远不会有资格进行垃圾回收,因为某些东西总是会引用它们。如果你想要那个功能,那么你必须实现它。 – 2012-03-08 07:34:00

+0

现在明白了。我是否必须关闭这个问题(如何?),或者让它保持原样,因为它是 – 2012-03-08 07:36:37

0

做到这一点的一种方法是让点具有对其父矩形的引用,然后矩形具有对其父国的引用。然后,静态函数将简单地为:

public Country FindCountry(Point p) 
{ 
    return p.Rectangle.Country; 
} 

当然,如果需要,可能会检查空值等。

0

为什么它必须是静态方法?

为了解决这个问题,你需要一个所有国家的集合,你可以循环并检查每一个点。你如何保留这个系列取决于你。你可以将它存储在某个对象中。它可以是Country类中的一个静态列表,当新国家使用构造函数创建时,它们被添加到列表中,或者列表可以是一个固定的静态列表,或者它可以在某个创建Country对象的工厂中创建,当它们被创建时存储对它们的引用。这可能取决于目前如何创建您的国家的最佳方案。有一点需要注意的是,保留创建的对象列表时,需要将它们从列表中删除,以便它们可以被垃圾收集,否则它们的内存将永远不会被释放。

您可以在国家/地区传递某个点的方法,并返回它的矩形是否包含该点,或者您可以从该国展示矩形并从外部展示该矩形。

0

我不知道一个内置的方式来获得一个类的所有对象。
只要使用填充了所有对象的静态字典(或其他集合类型)是我知道的最佳方式。像这样:

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); 

但我想你已经在这个方向上想过了。