Итак, вот код:
public interface IObserver<T> where T : StackEventData<T>
{
void HandleEvent(StackEventData<T> eventData);
}
public class Observer<T> : IObserver<T> where T : StackEventData<T>, new()
{
public StringBuilder Log = new StringBuilder();
public void HandleEvent(StackEventData<T> eventData)
{
Log.Append(eventData);
}
}
public class StackOperationsLogger
{
private readonly Observer<T> observer = new Observer<T>();
}
Мне нужно инициализировать наблюдателя Observer в StackOperationsLogger, не делая StackOperationsLogger универсальным. Какие-либо предложения?
Вам просто нужно заменить T на соответствующий тип, что кажется сложным, потому что вам нужен тип StackEventData типа такой же... что такое StackEventData<T> и почему он универсальный?
Убедитесь, что вы смотрите на System.IObserver<T> просто для справки, потому что ваша версия сильно отличается. Лично я изучаю шаблон уже пару лет, и это действительно полезно.





При условии, что у вас есть некоторые определения классов, подобные следующим:
public class ConcreteType : StackEventData<ConcreteType>
{
}
public class StackEventData<T>
{
}
Вы можете попробовать это:
public class StackOperationsLogger
{
private Observer<ConcreteType> observer = new Observer<ConcreteType>();
}
По-видимому, вы должны соответствующим образом спроектировать свой класс. Выше только что выделено, каким должно быть «имя» классов и что ожидается от класса ConcreteType, который вы определите -плохое имя ... вы также должны изменить это.
За исключением того, что Observer<int> не компилируется, потому что int нельзя привести к StackEventData<T> — что бы это ни было. Так что это не похоже на ответ на вопрос...
Но это тоже не компилируется, потому что StackEventData<int> не StackEventData<StackEventData<int>>. Кажется, это настоящая проблема в коде OP.
@oerkelens Теперь исправлено и проверено :) Видимо, мне нужно было проверить это более тщательно. Спасибо !!
Одной огромной проблемой является исходное универсальное определение интерфейса.
public interface IObserver<T> where T : StackEventData<T>
Поскольку ограничение типа определено рекурсивно, вы не можете использовать его так, как хотите. По сути, тип T должен быть примерно таким: StackEventData<StackEventData<StackEventData<StackEventData<T>>>> и т. д. Я не думаю, что это то, что вы ищете.
У меня такое чувство, что это то, что вы ищете.
public interface IObserver<T>
{
void HandleEvent(StackEventData<T> eventData);
}
public class Observer<T> : IObserver<T>
{
public StringBuilder Log = new StringBuilder();
public void HandleEvent(StackEventData<T> eventData)
{
Log.Append(eventData);
}
}
public class StackOperationsLogger
{
private readonly Observer<DataObject> observer = new Observer<DataObject>();
}
Я не уверен, что понимаю. Что для вас значит
Observer<T>, если StackOperationsLogger не является универсальным? Как бы вы его использовали?