gpt4 book ai didi

c# - 实现相互使用的类型化接口(interface)的问题

转载 作者:行者123 更新时间:2023-12-03 10:25:47 25 4
gpt4 key购买 nike

我有两个类型化的接口(interface)

public interface IComponentAreaModel<T>
public interface IComponentAreaViewModel<T>

View 模型的接口(interface)定义了一个属性“模型”,它是模型接口(interface)的类型:
IComponentAreaModel<T> Model { get; }

在我的实际实现中,我有一个实现“IComponentAreaModel”接口(interface)的模型,该接口(interface)运行良好:
public class ArticleModel : IComponentAreaModel<Article>

然后我实现 View 模型如下:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
public ArticleModel Model { get; }
}

在这里,编译器告诉我成员“模型”没有匹配的返回类型。为了解决这个问题,我必须按如下方式实现 View 模型:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
public IComponentAreaModel<Article> Model { get; }
}

但这很糟糕,因为我的 ArticleModel 类有一些不属于 IComponentAreaModel 的其他方法和内容。因此,当我想通过 ArticleViewModel 中的属性使用这些方法时,我必须将接口(interface)对象转换为实际对象。

有没有办法告诉编译器我的 ArticleModel 实现了 IComponentAreaModel,因此足以作为 IComponentAreaViewModel 的模型?

最佳答案

这取决于您如何使用这些接口(interface)。至少,有三种选择。

选项 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. 使用显式接口(interface)实现:
public class ArticleViewModel : IComponentAreaViewModel<Article>
{
// use this property, when you need ArticleModel
public ArticleModel Model { get; }

IComponentAreaModel<Article> IComponentAreaViewModel<Article>.Model => Model;
}

选项 3. 将第二个类型参数添加到 View 模型界面。会增加复杂性,尤其是如果您想使用 IComponentAreaViewModel<>与其他泛型类型:
public interface IComponentAreaViewModel<T, TModel>
where TModel : IComponentAreaModel<T>
{
TModel Model { get; }
}

public class ArticleViewModel : IComponentAreaViewModel<Article, ArticleModel>
{
public ArticleModel Model { get; }
}

关于c# - 实现相互使用的类型化接口(interface)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com