这些类有可能实现这些接口吗?
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
集合。
我正在尝试创建以下 类。
但我很难获得几个视图模型 类 来实现接口,详情如下。
数据模型类:
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
集合。