在这种情况下,我应该将接口作为参数而不是类传递?

时间:2017-10-13 05:26:57

标签: c# class methods interface parameter-passing

假设我有一个方法,现在将接口作为参数传递并将类作为参数传递时有什么不同?

Ex1.

public void GetPrice(IPartsData partsData)
{
     Do something
}

Ex2.
public void GetPrice(PartsData partsData)
{
     Do something.
}

在Ex1中,我正在使用接口,在Ex2中,我在GetPrice方法中传递类。

4 个答案:

答案 0 :(得分:1)

在这两种情况下,您都要通过该类的实例。但是,在参数中使用接口时,除非进行转换,否则仅限于界面中描述的功能。

这也意味着该方法更加友好,因为其他实现也可以使用该方法,并且还可以进行单元测试。

答案 1 :(得分:0)

这取决于您对方法行为的态度,如果您想允许用户(使用您的方法的其他开发人员)拥有自己的const value= "c.1.3"; const tree= [ { "id": "c.1", "children": [ { "id": "c.1.1" }, { "id": "c.1.2" }, { "id": "c.1.3" } ] } ]; const findTree= (tree)=>Rx.Observable.from(tree) .mergeMap(node=>{ if(!!node.children) return findTree(node.children); return Rx.Observable.of(node); }) .find(node=>node.id==value); findTree(tree).subscribe(console.info); 实现,您应该接受接口作为参数,在这种情况下调用者可以使用类IPartsData的不同实现来调用您的方法。 但是如果你想要使用已经实现的PartsData的确切指定的实现,那么你应该只接受IPartsData类作为参数。 这是OOP编程中的某种IoC概念。

答案 2 :(得分:0)

与您有2个类但两个类具有不同BaseClass的场景相关联时,会想到一个特定用例。这意味着您无法使用BaseClass类型的参数编写方法。相反,您将定义适合两个类的接口并将其分配给两个类。这使您可以将两个类传递给参数类型为BaseClass的方法。

答案 3 :(得分:0)

实施例。 1是更好的实践,因为使用接口促进了松散耦合的设计。

这意味着它更容易扩展,维护和单元测试。 (在单元测试方面,接口更容易模拟。)

请参阅this堆栈溢出帖,了解松散和紧耦合之间的区别。