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

C# 在哪种情况下,我应该将接口作为参数而不是类传递?,c#,class,methods,interface,parameter-passing,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方法中传递类。在这两种情况下,您都在传递类的实例。但是,当您在参数中使用

假设我有一个方法,那么当我将接口作为参数传递和将类作为参数传递时有什么区别

Ex1.

public void GetPrice(IPartsData partsData)
{
     Do something
}

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

在这里,我在Ex1中运行一个接口,在Ex2中,我在GetPrice方法中传递类。

在这两种情况下,您都在传递类的实例。但是,当您在参数中使用接口时,除非您强制转换该接口,否则仅限于接口中描述的功能


这也意味着该方法更友好一些,因为其他实现也可以使用该方法,并且更易于单元测试。

如果您希望允许用户(使用您的方法的其他开发人员)使用,这取决于您对方法行为的态度您应该接受接口作为参数,在这种情况下,调用方可以使用类
PartsData
的不同实现调用您的方法。 但是,如果您想使用之前已经实现的
IPartsData
的精确指定实现,您应该只接受
PartsData
类作为参数。
这是OOP编程中的某种IoC概念。

当您有两个类,但两个类都有不同的
基类时,会想到一个特定的用例。这意味着您不能使用
BaseClass
类型的参数编写方法。相反,您应该定义一个适合这两个类的接口,并将其分配给这两个类。这使您能够将这两个类传递给具有类型为
BaseClass

的参数的方法。由于使用接口可以促进松散耦合的设计,因此,Ex.1是更好的做法

这意味着它更易于扩展、维护和单元测试。(当涉及到单元测试时,接口更容易模拟。)

有关松耦合和紧耦合之间的区别,请参见烟囱溢流柱