通用接口实现混淆

4
我在接口实现方面遇到了一些麻烦,我尝试的所有“修复”方法似乎都使整个解决方案更加复杂和错误。我相信有一个简单的答案,但我现在还没有完全看清楚!
我有这两个接口(第二个接口在第一个接口的列表中使用):
public interface IUserDefinedListEditViewModel<T> where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>
{
    string TypeName { get; set; }
    IList<T> UserDefinedListEntries { get; set; }
}

public interface IUserDefinedListEntryEditViewModel<T> where T : IBaseUserDefinedListModel
{
    string Display { get; set; }
    T UserDefinedListEntry { get; set; }
}

我有一个第三方接口,由几个不同的类实现:

public interface IBaseUserDefinedListModel
{
    Guid Id { get; set; }
    string Name { get; set; }
    bool IsSystem { get; set; }
}

以下是我(错误的)实现尝试:
public class APEditViewModel : IUserDefinedListEditViewModel<APEntryEditViewModel>
{
    public string TypeName { get; set; }
    public IList<APEntryEditViewModel> UserDefinedListEntries { get; set; } = new List<APEntryEditViewModel>();
}

public class APEntryEditViewModel : IUserDefinedListEntryEditViewModel<APModel>
{
    public string Display { get; set; }
    public APModel UserDefinedListEntry { get; set; }
}

public class BaseUserDefinedListModel : IBaseUserDefinedListModel
{
    public Guid Id { get; set; }
    [Required(ErrorMessage = "The Name field is required.")]
    public string Name { get; set; }
    public bool IsSystem { get; set; }
}

public class APModel : BaseUserDefinedListModel
{
    public string NewValue { get; set; }
}

我目前遇到的主要错误是在 APEditViewModel 中,以下是(精简后的)错误信息:
The type 'APEntryEditViewModel' cannot be used as type parameter 'T' in the
generic type or method 'IUserDefinedListEditViewModel<T>'. There is no 
implicit reference conversion from 'APEntryEditViewModel' to 
'IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>'.

我不确定我是否需要这种通用接口,但是经过我的研究和实验,我相信我需要。我只是没有完全理解,并且我认为IUserDefinedListEditViewModel界面需要一个类型界面 (IUserDefinedListEntryEditViewModel) 是错误的。

抱歉我表达可能不够清晰,因为我不确定我哪里出了问题,所以任何问题我都会尽力回答/更新我的问题。


一个接口不应该被类实现。它是从类中插入和提取数据的方法。我认为你想把IBaseUserDefinedListModel变成一个类而不是一个接口。 - jdweng
@jdweng “接口不应该被类实现”?你可能需要重新表达一下。 - Camilo Terevinto
“接口不应该由类来实现。” 这听起来相当令人困惑。您是否介意对此进行详细说明? - Mong Zhu
“接口只能被类实现。” 接口也可以被结构体实现。 - ikkentim
@ikkentim,我最近很少使用结构体,以至于我忘记了这一点,不过还是谢谢你。 - Camilo Terevinto
2个回答

3

将您的 IUserDefinedListEditViewModel 接口更改为:

public interface IUserDefinedListEditViewModel<T1,T2> 
           where T1 : IUserDefinedListEntryEditViewModel<T2> 
           where T2 : IBaseUserDefinedListModel

在完成此步骤后,更新APEditViewModel中的实现:
public class APEditViewModel : IUserDefinedListEditViewModel<APEntryEditViewModel, APModel>

错误表明,在通用约束条件下,
where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>

只有实现了IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>接口的类型才能被接受为T。如果你想要IBaseUserDefinedListModel被接受作为T的类型参数,你需要将其泛型化。


这正是我想要的效果,我知道我已经接近了……差不多!只有一个小问题,在第一个接口类型的where之间不需要逗号。 - XN16

0
您需要为我们提供完整的业务场景,以便获得正确的设计建议。
就以上示例而言,问题是: 您定义的接口:
interface IUserDefinedListEditViewModel<T> where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>

但是在调用时,您正在将APEntryEditViewModel作为接口特定类型进行传递。这在面向对象编程中是错误的。

要成功编译此代码,您的

APEntryEditViewModel必须是IUserDefinedListEntryEditViewModel的实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接