継承

2016-10-03 21 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); 
} 

そして

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) 
    { 
    } 
} 

は、しかし、私はエラーを取得するこれらの2つの実装を'UserFilterHelper' does not implement interface member 'IFilterHelper<ApplicationUser>.Filter(ISearchModel<ApplicationUser>, ref IQueryable<ApplicationUser>)'

しかし、 UserSearchModelISearchModel<ApplicationUser>に変更すると、正常にコンパイルされます。私はそれをキャストして動作させることができますが、なぜそれが私にエラーを与えるのか知っています。ご覧のとおり、UserSearchModelクラスはインターフェイスISearchModel<ApplicationUser>を実装しています。私は何が欠けていますか?

答えて

4

インターフェイスには明示的にISearchModel<ApplicationUser>が必要です。UserSearchModelISearchModel<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