一个类如何在C#中识别自己的对象

时间:2012-03-08 07:22:40

标签: c# oop

我上课了。在c#中,是否有某种方式(我可以在静态方法中实现)可以识别此类的对象,由其他(调用)类实例化?

方案 实际上我有一个Country类,它包含一个成员Rectangle(有4个坐标)。我想编写一个静态方法,当传递一个点或vector2d时,它会在Country的每个实例化对象中搜索该点,并且可以返回该对象的ref。 我有Rectangle.Contains(point)方法,它告诉该点是否在调用矩形。

4 个答案:

答案 0 :(得分:2)

您必须将您班级的所有实例存储在一个集合中,然后搜索该集合以找到您需要的特定对象。

可以使这个集合成为你的类的静态成员,但它不需要。它可以替代地存储在别处作为另一个类的普通成员。例如,如果您使用CountryFactory来构建Country个对象,那么每次工厂构建一个国家/地区时,它也可以在工厂内的集合中存储对该国家/地区的引用。

请记住,当您不再需要该国家时,也要从该集合中删除该国家/地区,否则不会进行垃圾回收(或使用WeakReference)。

答案 1 :(得分:0)

一种方法是让点具有对其父Rectangle的引用,然后Rectangle引用其父Country。那么静态函数就是:

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

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

答案 2 :(得分:0)

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

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

你可以在Country上有一个方法,你传递一个点,它返回它的矩形是否包含那个点,或者你可以从国家公开矩形,也可以从外面公开矩形。

答案 3 :(得分: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);

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