2016-10-03 4 views
1

У меня есть эти 2 интерфейса:"не реализует член интерфейса" ошибка при использовании наследования

public interface IFilterHelper<T> 
{ 
    void Filter(ISearchModel<T> model, ref IQueryable<T> dbModel); 
} 

public interface ISearchModel<T> 
{ 
    IQueryable<T> GetDBModel(DbContext db); 
} 

И эти 2 реализаций

public class UserSearchModel : ISearchModel<ApplicationUser> 
{   
    public IQueryable<ApplicationUser> GetDBModel(DbContext db) 
    { 
     return db.Users.Where(u => true); //something like this 
    } 
} 

public class UserFilterHelper : IFilterHelper<ApplicationUser> 
{ 
    public void Filter(UserSearchModel model, ref IQueryable<ApplicationUser> dbModel) 
    { 
    } 
} 

Однако я получаю ошибку 'UserFilterHelper' does not implement interface member 'IFilterHelper<ApplicationUser>.Filter(ISearchModel<ApplicationUser>, ref IQueryable<ApplicationUser>)'

Но когда я меняю UserSearchModel с ISearchModel<ApplicationUser>, он успешно компилируется. Я знаю, что могу бросить его и заставить его работать, но почему это дает мне эту ошибку. Как видите, класс UserSearchModel реализует интерфейс ISearchModel<ApplicationUser>. Что мне не хватает?

ответ

4

Интерфейс явно требует ISearchModel<ApplicationUser>, и хотя UserSearchModel реализует ISearchModel<ApplicationUser>, это не единственный, который мог бы. Я мог бы создать класс SuperUserSearchModel, который также будет реализовывать тот же интерфейс.

Так что попытка написать public void Filter(UserSearchModel model, ref IQueryable<ApplicationUser> dbModel) означает, что вы ограничиваете реализацию интерфейса.

Чтобы сделать его работу вы должны создать свой интерфейс, как это:

public interface IFilterHelper<T, R> where R : ISearchModel<T> 
{ 
    void Filter(R model, ref IQueryable<T> dbModel); 
} 

public class UserFilterHelper : IFilterHelper<ApplicationUser, UserSearchModel> 
{ 
    public void Filter(UserSearchModel model, ref IQueryable<ApplicationUser> dbModel) 
    { 
    } 
} 
+0

Большое спасибо. Теперь, когда я прочитал ваш ответ, я вижу, где я был неправ. Еще раз спасибо. –

0

Ваш UserFilterHelper имеет неправильный тип параметра в методе фильтра:

public class UserFilterHelper : IFilterHelper<ApplicationUser> { 

public void Filter(ISearchModel<ApplicationUser> /* Not UserSearchModel */ model, ref IQueryable<ApplicationUser> dbModel) 
{ 
} 

}

Вы по-прежнему будете передавать «UserSearchModel» в качестве параметра. Это только сигнатура метода, которая требует от нее ISearchModel

+0

Прочтите последний абзац. –

+0

Я бы сказал, что @Enigmativity имеет лучший подход. Но оба пути будут работать. – Van

+0

Поскольку для сигнатуры интерфейса требуется ISearchModel независимо от того, кто или кто его реализует. Подпись должна быть ISearchModel . Чтобы обойти эту проблему, вам нужно будет сделать то, что предложил Enigmativity – Van

Смежные вопросы