gpt4 book ai didi

在方法声明中使用时的 C# 接口(interface)

转载 作者:行者123 更新时间:2023-11-30 22:03:42 24 4
gpt4 key购买 nike

问你们一个小问题,我正在尝试创建一个接口(interface),该接口(interface)在用于搜索/查看/创建/修改记录时定义工厂函数的标准,因此我创建了以下接口(interface):

public interface iRecordAdmin
{
iViewModel Create(iCreateModel model);
iSearchResultsModel Search(iSearchModel model);
void Hydrate(iRecordModel model);
iViewModel Save(iRecordModel model);
}

然后我为要继承的各个模型项(iCreateModel、iViewModel 等)定义了接口(interface),但通常接口(interface)不包含特定于数据的属性,实际上它们用于确保工厂类遵循通用模式。

我的问题是在工厂中使用这些时,在实现接口(interface)时我不能在方法定义中使用实现类,例如:

public class CreateModel : iCreateModel
{
/// ... propeties etc...
}

因此在继承 iRecordAdmin 的类中,我尝试使用 CreateModel 的类定义,但编译器拒绝它,说接口(interface)未正确实现...所以这不起作用:

 public ViewModel Create(CreateModel model)
{

}

但是这样做:

 public iViewModel Create(iCreateModel model)
{
CreateModel newModel = (CreateModel)model;
}

现在我明白了我可以将方法参数更改为接口(interface)的参数(在本例中为 iCreateModel),但能够使用类类型从方法内部保存转换更有用。

有什么想法吗?我应该以不同的方式设计它吗?

最佳答案

一个接口(interface)定义了一个契约。通过更改实现中的参数类型,您违反了该契约,并且从持有接口(interface)引用的类调用很容易失败。

假设一个类有这样的代码:

iRecordAdmin myAdmin = new CreateModel();
myAdmin.Create(new OtherCreateModel);

很明显,如果允许的话,给定 CreateModel 上的参数,此代码将失败。由于接口(interface)定义,它的代码完全有效且可编译。

如果这对您的实现有意义,您可以使用泛型,但仅在接口(interface)采用接口(interface)参数时才接受特定的派生类是一个坏主意,并且在 C# 中是不允许的。需要像这样转换当然表明您需要重新考虑您的设计。

关于在方法声明中使用时的 C# 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25852665/

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