2012-03-08 2 views
1

У меня есть класс. В C# существует какой-то способ (который я могу реализовать в статическом методе), который может идентифицировать объект этого класса, созданный каким-то другим (вызывающим) классом?Как класс может идентифицировать свои собственные объекты в C#

Сценарий На самом деле у меня есть класс Страны, который содержит элемент Rectangle (имеющий 4 координаты). Я хочу написать статический метод, который при передаче точки или vector2d ищет эту точку в каждом из экземпляров объектов страны и может возвращать ref этого объекта. У меня есть метод Rectangle.Contains (point), который указывает, находится ли эта точка в вызове прямоугольника.

+0

Похоже, вы ищете утечку рисунка мухи. Вы можете посмотреть на это. –

ответ

2

Вам нужно будет сохранить все экземпляры вашего класса в коллекции и выполнить поиск в коллекции, чтобы найти конкретный объект, который вам нужен.

Вы можете сделать эту коллекцию статическим членом вашего класса, но это не обязательно. Вместо этого он может быть сохранен в другом месте как обычный член другого класса. Например, если у вас есть CountryFactory, который вы используете для создания объектов Country, то каждый раз, когда завод создает страну, он также может хранить ссылку на эту страну в коллекции внутри фабрики.

Помните также, чтобы удалить страну из коллекции, когда она вам больше не нужна, иначе она не будет собираться мусором (или использовать WeakReference).

+0

это то, что я делаю.У меня есть массив в классе Game, и я просматриваю все элементы и проверяю, содержится ли в нем точка. Но разве нет лучшего способа? Почему класс не узнает все созданные объекты (где-то еще) своего типа? –

+0

если что-то хранит список всех построенных объектов, тогда эти объекты никогда не будут иметь права на сбор мусора, поскольку что-то всегда будет иметь к ним ссылку. Если вы хотите эту функциональность, вам нужно ее реализовать. –

+0

получил его сейчас. мне нужно закрыть этот вопрос (как?) или просто оставить его как есть –

0

Один из способов сделать это - иметь точки, имеющие ссылку на их родительский прямоугольник, а затем Rectangle имеют ссылку на родительскую страну. Тогда статическая функция будет просто следующей:

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

Конечно, могут быть проверки нулей и т. Д., Если необходимо.

0

Почему это должен быть статический метод?

Чтобы решить эту проблему, вам понадобится коллекция из всех стран, в которую вы можете пройти, и проверить каждую из них. Как вы храните эту коллекцию до вас. Вы можете сохранить его в каком-либо объекте. Это может быть статический список внутри класса 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); 

Но я думаю, вы уже подумали в этом направлении.

Смежные вопросы