У меня есть пул объектов, и мне нужно вызывать метод делегата OnFree () всякий раз, когда я вызываю Free () для объекта в пуле.
Free () создается извне и устанавливается на объекте при создании пула. OnFree отличается от одного объекта к другому, а иногда он даже равен нулю.
Объекты в пуле наследуются от класса Poolable.
class Poolable
{
public Action Free();
public Action OnFree();
}
В настоящее время я создаю OnFree в классе наследования, выполняя это:
class Light
{
public Light()
{
// Create method to be called when Free() is called on this light.
OnFree = () =>
{
DoStuffHere();
};
}
}
Тем не менее, это создаст отдельный делегат для каждого источника света, который тратит кучу памяти, особенно когда в пуле десятки тысяч объектов. Э-э, он создает новый делегат каждый раз, когда вызывается этот конструктор, верно?
Каков хороший способ разрешить объектам создавать свой собственный делегат OnFree (), чтобы в каждом типе объекта был только один делегат вместо одного делегата в каждом экземпляре?
Я, конечно, могу думать о способе , но я надеюсь, что кто-то может подумать о "хорошем" способе, который позволяет легко обслуживать.
Редактировать: Могу ли я сделать делегат OnFree () статическим в базовом классе, чтобы он был статическим для унаследованного типа?
Редактировать: разъяснить, как используется пул и почему Free()
является делегатом, а не виртуальным методом. Пожалуйста, дайте мне знать, если вы можете придумать лучший способ сделать это.
public class Pool<T> where T : Poolable
{
private int _liveCount;
private T[] _pool;
[...]
public Pool(int capacity, Func<T> allocateFunction)
{
[...]
// Fill pool with initial items:
for (int i = 0; i < capacity; i++)
{
T item = _allocate();
item.Free = () => Free(item);
_pool[i] = item;
}
}
/// <summary>
/// Frees given object from this pool. Object is assumed to
/// be in this pool.
/// </summary>
public void Free(Poolable obj)
{
obj.OnFree();
_liveCount -= 1;
[...]
}
}