Используйте смешанный стиль; например не делайте данные частью узла, а узлом - частью данных:
struct avl_node {
struct avl_node *parent;
struct avl_node *left;
struct avl_node *right;
};
struct person {
char const *name;
struct avl_node node;
};
struct animal {
struct avl_node node;
int dangerousness;
};
Конструкторы для animal
похожи на
struct animal *animal_create(double d)
{
struct animal *animal = malloc(sizeof *animal);
*animal = (struct animal) {
.node = AVL_NODE_INIT(),
.dangerousness = d,
};
return animal;
}
Общие операции дерева AVL могут выглядеть как [ 119]
void avl_tree_insert(struct avl_node **root, struct avl_node *node,
int (*cmp)(struct avl_node const *a, struct avl_node const *b))
{
/* .... */
}
и функция cmp
для animal
, как
int animal_cmp(struct avl_node const *a_, struct avl_node const *b_)
{
struct animal const *a = container_of(a_, struct animal, node);
struct animal const *b = container_of(b_, struct animal, node);
return a->dangerousness - b->dangerousness;
}
Самое легкое и, по-моему, самый чистый путь состоит в том, чтобы использовать общедоступное статическое свойство класса обслуживания. Единственное время это не будет работать, - то, при использовании того же класса обслуживания для выполнения многочисленных услуг в том же процессе, что-то, что очень редко.
private static MyService m_ServiceInstance;
public static MyService ServiceInstance
{
get { return m_ServiceInstance; }
}
public MyService()
{
InitializeComponents();
//Other initialization
m_ServiceInstance = this;
}
Введение сервисного экземпляра в каждый метод, для которого мог возможно быть нужным он, является альтернативой, но это может быстро стать грязным, и это не имеет никаких реальных преимуществ просто использование статического свойства.
Проверьте пример здесь на то, как использовать класс ServiceController, чтобы запустить и остановить сервисы.
С другой стороны, Вы могли передать свой сервисный экземпляр потоку, когда Вы создаете его (или установите его как переменную экземпляра в классе потока, и т.д.), не имея необходимость делать Ваш класс обслуживания статичным.
Короткий пример для полноты:
ServiceController sc = new ServiceController("MyService");
sc.Stop();