使用对象时的接口或类

时间:2012-05-23 10:56:58

标签: c# .net interface

在我的项目中,我定义了一个接口来描述每个不同的数据库连接类必须具有的方法。这称为IDatabaseConnectivityObject。我的每个类都实现了这个接口,以确保它们都包含相同的方法来运行查询,建立连接等等。

请考虑以下代码:

IDatabaseConnectivityObject adoDataBaseConnection = new DbProviderFactoryConnection();

DbProviderFactoryConnection adoDataBaseConnection = new DbProviderFactoryConnection();

以上几行是否都表现相同?如果是这样的话?如果不是那么为什么不呢?两者有什么好处?

这可能是一个非常愚蠢的问题,但我没有使用那么长的接口,我不知道第1行是做什么的。我的理解是你不能创建一个接口的实例,因为它只是定义了行为,那么该行怎么可能呢?

4 个答案:

答案 0 :(得分:2)

  

以上几行是否都表现相同?如果是这样的话?

在运行时是的。不同之处在于,如果声明类型IDatabaseConnectivityObject的变量,那么在编译时,您将只能看到变量上此接口的成员。另一方面,如果您将其声明为DbProviderFactoryConnection,那么您将看到此类的所有成员。

作为一种好的做法,建议在声明变量(在这种情况下为IDatabaseConnectivityObject)时始终使用层次结构中可能的最高类型,这允许您访问使用者需要的所有成员。

答案 1 :(得分:1)

第一个允许您交换前进的IDatabaseConnectivityObject的不同实现。

这是一个很好的做法,因为它可以让您的系统更好地抵制前进的变化。保持低变化成本是关键。

答案 2 :(得分:1)

接口定义了消费者可以依赖的合同,如果您愿意,则定义API。如果您打算使用界面上的成员,这两行在功能上是相同的。

使用界面只表示你不关心某些事情是如何实现的,只是它被实现为契约。接口也促进了松散耦合。

针对接口进行编程的好处是,您正在编写“协议”而不是“执行”,或合同而不是实现。这对测试有很大的积极影响,因为您可以在测试期间模拟或存根接口,以减少测试场景中无关的依赖项的数量。

与上述类似的好处是,使用接口以及工厂模式,IoC或DI之类的东西,您可以动态地提供不同的接口实现 - 例如,为不同的客户提供不同的业务逻辑处理程序。 / p>

另一个好处是它有助于解决缺乏多重继承问题。大多数东西都可以通过接口很好地表达,类可以实现多个接口。

答案 3 :(得分:0)

你已经要求获益了。

当您使用接口进行编程(并使用工厂来创建具体类型)时,这会使单元测试更容易,因为您可以模拟放入逻辑(单元)的实例。

这实际上是'设计模式原则':

  

“编程到'接口',而不是'实现'。” (Gang of Four 1995:18)

相关问题