2016-10-03 45 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>)'

但當我更改UserSearchModelISearchModel<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