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

时间:2014-09-15 16:31:28

标签: c# interface

快速提问您,我正在尝试创建一个界面,用于在搜索/查看/创建/修改记录时定义工厂函数的标准,因此我创建了以下界面:

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

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

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

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

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

 public ViewModel Create(CreateModel model)
 {

 }

但这样做:

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

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

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

2 个答案:

答案 0 :(得分:3)

接口定义合同。通过更改实现中的参数类型,您违反了该合同,并且调用可能很容易从持有接口引用的类失败。

假设一个类有这个代码:

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

显然,如果CreateModel上的参数允许,则此代码将失败。由于接口定义,它的代码完全有效且可编译。

可以使用泛型,如果这对你的实现有意义,但是当接口接受一个接口参数时只接受一个特定的派生类是一个坏主意,而不是C#中允许的。你是需要像这样投射肯定表明你需要重新思考你的设计。

答案 1 :(得分:0)

您也可以考虑使用显式接口声明。