我有这两个接口:
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)
{
}
}
但是我收到错误'UserFilterHelper' does not implement interface member 'IFilterHelper<ApplicationUser>.Filter(ISearchModel<ApplicationUser>, ref IQueryable<ApplicationUser>)'
但是当我用UserSearchModel
更改ISearchModel<ApplicationUser>
时,它会成功编译。我知道我可以投它并让它工作,但为什么它会给我这个错误。如您所见,UserSearchModel
类实现了接口ISearchModel<ApplicationUser>
。我错过了什么?
答案 0 :(得分: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)
{
}
}
意味着您正在限制接口的实现。
要使其正常工作,您必须设计如下界面:
M1 = tf.Variable(tf.random_normal([2,3,4]))
M2 = tf.Variable(tf.random_normal([5,4]))
N = tf.einsum('ijk,lk->ijl',M1,M2)
答案 1 :(得分:0)
您的UserFilterHelper在过滤器方法中具有错误的参数类型:
public class UserFilterHelper : IFilterHelper<ApplicationUser> {
public void Filter(ISearchModel<ApplicationUser> /* Not UserSearchModel */ model, ref IQueryable<ApplicationUser> dbModel)
{
}
}
您仍会传递“UserSearchModel”&#39;作为参数。只有方法签名才需要它是ISearchModel