Самая большая проблема в том, что ваши интерфейсы не определены должным образом и не соответствуют цели вашего кода.
Если ваш T
не виден в интерфейсе, то внешний код недаже нужно знать, что есть T
.Вам нужно либо создать методы, которые получают или возвращать T
, либо иметь какое-либо свойство типа T
, либо вы просто должны полностью избавиться от T
и сделать свои интерфейсы не универсальными.
Как только вы подтвердите это, должно стать более очевидным, почему вам не нужны два разных интерфейса, и вам больше не нужно их согласовывать.
Если окажется, что вы делаете нужна версия, которая принимает T
, и версия не-T, тогда более идиотский способ сделать это - обойти object
вместо T
:
public interface IFoo
{
void DoSomething(object o);
object DoSomethingElse();
}
public interface IFoo<T>
{
void DoSomething(T item);
T DoSomethingElse();
}
См. интерфейсы, такие как *Примеры 1020 *, ICollection
, IList
и т. Д.
Но внимательно рассмотрим .Этот последний компромисс дизайна (имеющий как универсальную, так и объектную версию) всегда оставляет желать лучшего.
Вы пожертвуете одним из них:
- Хороший дизайн интерфейса, который напрямую связываетконтракт на разработку (если вы генерируете исключения или не выполняете операции, когда передается неправильный тип)
- Безопасность типов и сокращение ошибок, связанных с этим (если вы правильно работаете с любым старым объектом)