我正在尝试创建以下类。
但是我正在努力获得一些视图模型类来实现接口,如下所述。
数据模型类:
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