我有两个类型化的接口
public interface IComponentAreaModel<T>
public interface IComponentAreaViewModel<T>
视图模型的接口定义了属性“ Model”,该属性属于模型接口的类型:
IComponentAreaModel<T> Model { get; }
在我的实际实现中,我有一个模型可以实现'IComponentAreaModel'接口,该接口可以正常工作:
public class ArticleModel : IComponentAreaModel<Article>
然后我按如下方式实现视图模型:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
public ArticleModel Model { get; }
}
在这里,编译器告诉我成员'Model'没有匹配的返回类型。要解决此问题,我将必须按如下方式实现视图模型:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
public IComponentAreaModel<Article> Model { get; }
}
但是这很糟糕,因为我的ArticleModel类具有一些其他方法和东西,这些方法和东西不属于IComponentAreaModel。因此,当我想通过ArticleViewModel中的属性使用这些方法时,就必须将接口对象转换为实际对象。
是否可以告诉编译器我的ArticleModel实现了IComponentAreaModel,因此足以作为IComponentAreaViewModel的模型?
答案 0 :(得分:2)
这取决于您如何使用这些界面。至少有三个选项。
选项1.在实现内使用字段:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
// use this field, when you need ArticleModel
private readonly ArticleModel model;
// TODO: initialize model somehow
public IComponentAreaModel<Article> Model => model;
}
选项2。使用显式接口实现:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
// use this property, when you need ArticleModel
public ArticleModel Model { get; }
IComponentAreaModel<Article> IComponentAreaViewModel<Article>.Model => Model;
}
选项3.添加第二个类型参数以查看模型界面。会增加复杂性,尤其是如果您想将IComponentAreaViewModel<>
与其他通用类型一起使用:
public interface IComponentAreaViewModel<T, TModel>
where TModel : IComponentAreaModel<T>
{
TModel Model { get; }
}
public class ArticleViewModel : IComponentAreaViewModel<Article, ArticleModel>
{
public ArticleModel Model { get; }
}