Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

В чем принципиальная разница между обобщенными методами и обобщенными типами?

#c_sharp #generics #интерфейс #c_sharp_faq


Столкнулся с непониманием.
Вот предположим, мне нужно создать интерфейс для какого то элемента бизнес логики,
но я совершенно ничего не хочу знать о DTO между BLL и уровнем представления, для этого
я напишу что то в таком духе:

public interface IOrderService where 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(); } }

Комментариев нет:

Отправить комментарий