Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每个参数都应该使用一个接口吗?_C#_Interface - Fatal编程技术网

C# 每个参数都应该使用一个接口吗?

C# 每个参数都应该使用一个接口吗?,c#,interface,C#,Interface,如果我有如下方法: public void AddProduct(Product product) { } 我是否应该让我的所有类实现一个接口,以便我可以: public void AddProduct(IProduct product) { } (如果产品是一个实体(映射到db表)没有银弹。接口和基类一起可以满足几乎所有的需求,但接口永远不会完全取代基类,反之亦然 “过度接口”的潜在风险是接口很难更改,尤其是当它们传播到更多代码时。如果IPProduct需要新属性,则将其添加到接口中可

如果我有如下方法:

public void AddProduct(Product product)
{

}
我是否应该让我的所有类实现一个接口,以便我可以:

public void AddProduct(IProduct product)
{

}

(如果产品是一个实体(映射到db表)

没有银弹。接口和基类一起可以满足几乎所有的需求,但接口永远不会完全取代基类,反之亦然

“过度接口”的潜在风险是接口很难更改,尤其是当它们传播到更多代码时。如果IPProduct需要新属性,则将其添加到接口中可能需要广泛更改。基类(抽象或其他)可以通过在不影响子类的情况下轻松更改基来解决此问题

另一方面.NET不允许多重继承,因此基本分类也远不是silverbullet



一个有趣的旁注:我没有立即可用的来源,但有一个框架父亲(Kwalina或Abrams或他们的同龄人)请注意,在.NET中引入接口主要是作为多重继承的替代;其基调是,如果.NET从零开始重写,它很可能会利用多重继承。

主要是为了能够为单元测试交换交互,这就是为什么要使用接口


如果您只是简单地使用
产品
作为,那么我不会这样做。

原则是您的方法应该尽可能少地了解传入的对象。如果接口是实现这一点的最佳方式,那么一定要使用接口。但还有其他方式


例如,如果您有一个
Customer
对象,该对象具有一个
LastName
属性,您只需要在方法中读取该属性,而不是有一个
Customer
参数,则使用一个名为
LastName
的字符串参数,然后传入
myCustomer.LastName

每个参数?绝对不是.InteFace可以增加灵活性,在某些情况下可以减少维护(但在其他情况下可以显著增加),但它们确实会增加代码的复杂性


你所给出的例子似乎是一个合理的使用界面。像你在设计程序时所做的每一个决定一样,你需要单独考虑每种情况。但是用接口来覆盖所有的东西都是疯狂的途径。

< P>我把界面看作是契约行为的一种方式。对该接口进行注释应强制执行您在接口中设定的任何契约

因此,我只会在传递的对象包含对象必须使用的行为时使用接口。这主要是为了在测试时,您可以使用模拟对象切换该对象,以确保其正常工作


因为POD不包含行为,所以我不会对它们进行接口。这是因为我看不到任何衍生的好处。如果POD的数据类型或内容发生变化,那么无论该POD是否由接口缓冲,在使用该POD的任何地方都会发生彻底的变化。模拟POD进行测试是没有意义的,因为模拟的外观它就像真实的东西一样。

您可以始终使用接口,然后为该接口创建基类。这是真的,但如果必须添加新成员,则必须同时修改接口和基类。如果您无法修改接口,则会产生更大的问题(并且应该倾向于基类)但是我明白你的意思,并且经常提供一个接口的股票实现。