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进行测试是没有意义的,因为模拟的外观它就像真实的东西一样。您可以始终使用接口,然后为该接口创建基类。这是真的,但如果必须添加新成员,则必须同时修改接口和基类。如果您无法修改接口,则会产生更大的问题(并且应该倾向于基类)但是我明白你的意思,并且经常提供一个接口的股票实现。