实现相互使用的类型化接口的问题

时间:2018-12-20 10:55:41

标签: c# mvvm interface

我有两个类型化的接口

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的模型?

1 个答案:

答案 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; }
}