#c_sharp #generics #интерфейс #c_sharp_faq
Столкнулся с непониманием. Вот предположим, мне нужно создать интерфейс для какого то элемента бизнес логики, но я совершенно ничего не хочу знать о DTO между BLL и уровнем представления, для этого я напишу что то в таком духе: public interface IOrderServicewhere T : class { int MakeOrder(T t); T GetOrder(int id); IEnumerable GetOrders(); void Dispose(); } тогда реализация на уровне BLL будет какая то такая: class OrderService : IOrderService { public void Dispose() { throw new NotImplementedException(); } public OrderDTO GetOrder(int id) { throw new NotImplementedException(); } public IEnumerable GetOrders() { throw new NotImplementedException(); } public int MakeOrder(OrderDTO t) { throw new NotImplementedException(); } } Но почему я не могу сделать интерфейс таким: public interface IResourceService { int MakeResource (T t); T GetResource (int id); IEnumerable GetResources (); void Dispose(); } и реализовать его как то так: class ResourceService : IResourceService { public void Dispose() { throw new NotImplementedException(); } public ResourceDTO GetResource (int id) { throw new NotImplementedException(); } public IEnumerable GetResources () { throw new NotImplementedException(); } public int MakeResource (ResourceDTO t) { throw new NotImplementedException(); } } Я понимаю, что речь идет о каком то непонимании базовых принципов. Поэтому прошу помочь разобраться. Дополнение: В общем вопрос свелся к тому, можно ли сделать как то так? public interface IResourceService { T GetResource (int id); } public class ResourceService : IResourceService { public T GetResource (int id) where T : ResourceDTO { return new ResourceDTO(); } } Если да, то как, если нет, то почему?
Ответы
Ответ 1
Но почему я не могу сделать интерфейс таким: Можешь, однако в этом случае T для каждой из функций int MakeResource(T t); T GetResource (int id); IEnumerable GetResources (); будет своим и не зависеть от других, то есть можно будет вызвать MakeResource с одним T, GetResource(id) с другим T, GetResource() с третьим T В случае же с public interface IOrderService where T : class { int MakeOrder(T t); T GetOrder(int id); IEnumerable GetOrders(); void Dispose(); } Тип T будет один и тот же у каждой из функций, тот что указан у класса. т.е. получается при реализации интерфейса IResourceService (ResourceService) я не смогу ограничить методы по типу Да, ограничения на параметр типа должны совпадать с ограничениями типа в интерфейсе. То есть, если было , то оно и останется, и указать параметр типа можно будет только при вызове. Ответ 2
В общем вопрос свелся к тому, можно ли сделать как то так? public interface IResourceDTO { ... } public interface IResourceService { T GetResource(int id) where T : class, IResourceDTO, new(); } public class ResourceService : IResourceService { public T GetResource (int id) where T : class, IResourceDTO, new() { return new T(); } }
Комментариев нет:
Отправить комментарий