C# 这些类是否可以实现这些接口?
我正在尝试创建以下类 但我正在努力获得几个视图模型类来实现接口,如下所述 数据模型类:C# 这些类是否可以实现这些接口?,c#,generics,interface,covariance,C#,Generics,Interface,Covariance,我正在尝试创建以下类 但我正在努力获得几个视图模型类来实现接口,如下所述 数据模型类: public interface IPage { string PageTitle { get; set; } string PageContent { get; set; } } public interface IDatedPage : IPage { DateTime PageDate { get; set; } } public abstract class Pa
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>
{
}
相关视图模型类:
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>
{
}
但它给了我一个错误:
无效差异:类型参数“T”在“IPageAdminViewModel.Pages”上必须始终有效T’是协变的
它不允许我将out
添加到.Pages
属性:
方差修饰符无效。只能将接口和委托类型参数指定为变量
我的尝试2: 我了解了这一点,所以我尝试将所有
IPagedList
属性更改为IEnumerable
。但我仍然在努力
“AboutPageAdminViewModel”未实现接口成员“IPageAdminViewModel.Pages”PageAdminViewModel公共类关于GeAdminViewModel
:PageAdminViewModel
,IPageAdminViewModel
{
}
您对类的两个约束相互矛盾
PageAdminViewModel
表示Pages
集合返回一组AboutPage
s,并且只接受AboutPage
。而,IPageAdminViewModel
表示Pages
返回任何IPage
,也可以获取任何IPage
。因此,虽然一个约束只保证关于IPage
的信息,但另一个约束为任何IPage
打开了大门。简而言之,不允许,如果允许,您可以从Pages
集合中获取ProfilePage
,因为它也是IPage
。获得这两种行为的唯一方法是分别实现每个页面集合。为什么要在继承自实现它们的类的类上实现接口?我通常不会,但是将它显式地添加到类中可以让我看到在修改代码时错误消息是否发生了变化。为什么要进行向下投票?我很乐意得到一个解释,因为这个问题没有违反我所知道的任何指导原则。你能发布你的IPagedList界面吗(我不知道是否有否决票)?可能重复“总之不允许”-残酷的事实:(谢谢解释