代码之家  ›  专栏  ›  技术社区  ›  Martin Hansen Lennox

这些类可以实现这些接口吗?

  •  -1
  • Martin Hansen Lennox  · 技术社区  · 7 年前

    我正在尝试创建以下类。

    但是我正在努力获得一些视图模型类来实现接口,如下所述。

    数据模型类:

    public interface IPage
    {
        string PageTitle { get; set; }
        string PageContent { get; set; }
    }
    public interface IDatedPage
        : IPage
    {
        DateTime PageDate { get; set; }
    }
    
    
    
    public abstract class Page
        : IPage
    {
        public string PageTitle { get; set; }
        public string PageContent { get; set; }
    }
    public abstract class DatedPage
        : Page
        , IDatedPage
    {
        public DateTime PageDate { get; set; }
    }
    
    
    
    public class AboutPage
        : Page
        , IPage
    {
    }
    public class NewsPage 
        : DatedPage
        , IDatedPage
    {
    }
    

    相关视图模型类:

    public interface IPageAdminViewModel<T>
        where T : IPage
    {
        IPagedList<T> Pages { get; set; }
    }
    public interface IDatedPageAdminViewModel<T>
        : IPageAdminViewModel<T>
        where T : IDatedPage
    {
    }
    
    
    public abstract class PageAdminViewModel<T>
        : IPageAdminViewModel<T>
        where T: IPage
    {
        public IPagedList<T> Pages { get; set; }
    }
    public abstract class DatedPageAdminViewModel<T>
        : PageAdminViewModel<T>
        , IDatedPageAdminViewModel<T>
        where T : IDatedPage
    {
    }
    
    
    public class AboutPageAdminViewModel
        : PageAdminViewModel<AboutPage>
        , IPageAdminViewModel<IPage>
    {
    }
    
    public class NewsPageAdminViewModel
        : DatedPageAdminViewModel<NewsPage>
        , IDatedPageAdminViewModel<IDatedPage>
    {
    }
    

    问题

    我拿不到 AboutPageAdminViewModel 实施 IPageAdminViewModel<IPage> .

    类似地 NewsPageAdminViewModel 无法实现 IDatedPageAdminViewModel<IDatedPage> .

    “aboutPageAdminViewModel”不实现接口成员“ipageAdminViewModel<ipage>.pages”。pageAdminViewModel<about page>.pages'无法实现'ipageAdminViewModel<ipage>.pages',因为它没有匹配的返回类型'ipagedList<ipage>'。


    我试过的1:

    我已经尝试添加 out 到接口定义上的泛型参数,如下所示:

    public interface IPageAdminViewModel<out T>
        where T : IPage
    {
        IPagedList<T> Pages { get; set; }
    }
    public interface IDatedPageAdminViewModel<out T>
        : IPageAdminViewModel<T>
        where T : IDatedPage
    {
    }
    

    但它给了我一个错误:

    差异无效:类型参数“t”必须在“ipageAdminViewModel.pages”上保持不变有效。t'是协变的。

    我不想再加一句 外面的 .Pages 属性:

    方差修饰符无效。只能将接口和委托类型参数指定为变量。


    我试过的2:

    我知道了 the out parameter doesn't play nicely with List<> ,所以我试图改变一切 IPagedList 属性到 IEnumerable . 但我还是得到了;

    “aboutPageAdminViewModel”不实现接口成员“ipageAdminViewModel<ipage>.pages”。pageAdminViewModel<about page>.pages'无法实现'ipageAdminViewModel<ipage>.pages',因为它没有匹配的返回类型'IEnumerable<ipage>'。


    更新

    我试着把它分成几个小问题,这是第一个:

    Generic parameter - using a concrete type compiles, but an implemented interface does not

    1 回复  |  直到 7 年前
        1
  •  0
  •   JSteward    7 年前
    public class AboutPageAdminViewModel
        : PageAdminViewModel<AboutPage>
        , IPageAdminViewModel<IPage>
    {
    }
    

    你对类的两个约束相互矛盾。 PageAdminViewModel<AboutPage> 说的是 Pages 集合返回一组 AboutPage 并且只接受 关于页面 . 虽然, IPageAdminViewModel<IPage> 说的是 返回任意 IPage 可以吃任何 iPAGE 也是。因此,当一个约束只保证 关于页面 另一个约束打开任何 iPAGE . 总之,不允许,如果允许的话,你可以得到 ProfilePage 离开 因为它也是 iPAGE . 唯一可以同时获得这两种行为的方法是实现 单独收集。

    推荐文章