这些类有可能实现这些接口吗?

Is it possible for these classes to implement these interfaces?

我正在尝试创建以下 类。

但我很难获得几个视图模型 类 来实现接口,详情如下。

数据模型类:

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' does not implement interface member 'IPageAdminViewModel<IPage>.Pages'. 'PageAdminViewModel<AboutPage>.Pages' cannot implement 'IPageAdminViewModel<IPage>.Pages' because it does not have the matching return type of '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
{
}

但它给了我错误:

Invalid variance: The type parameter 'T' must be invariantly valid on 'IPageAdminViewModel.Pages'. 'T' is covariant.

它不允许我将 out 添加到 .Pages 属性:

Invalid variance modifier. Only interface and delegate type parameters can be specified as variant.


我试过的 2:

我了解到 the out parameter doesn't play nicely with List<>,所以我尝试将所有 IPagedList 属性更改为 IEnumerable。但我还是得到了;

'AboutPageAdminViewModel' does not implement interface member 'IPageAdminViewModel<IPage>.Pages'. 'PageAdminViewModel<AboutPage>.Pages' cannot implement 'IPageAdminViewModel<IPage>.Pages' because it does not have the matching return type of 'IEnumerable<IPage>'.


更新

我想把它分解成更小的问题,这是第一个问题:

public class AboutPageAdminViewModel
    : PageAdminViewModel<AboutPage>
    , IPageAdminViewModel<IPage>
{
}

您对 class 的两个约束相互矛盾。 PageAdminViewModel<AboutPage> 表示 Pages 集合 returns 一组 AboutPage 并且将只接受一个 AboutPage。而 IPageAdminViewModel<IPage> 表示 Pages returns 任何 IPage 并且也可以采用任何 IPage。因此,虽然一个约束只保证 AboutPage,但另一个约束为任何 IPage 打开了大门。简而言之,不允许,如果允许,您可以从 Pages 集合中得到一个 ProfilePage,因为它也是一个 IPage。获得这两种行为的唯一方法是分别实现每个 Pages 集合。