接口和类之间的区别是什么,为什么我可以直接在类中实现方法,却要使用接口呢?

18 浏览
0 Comments

接口和类之间的区别是什么,为什么我可以直接在类中实现方法,却要使用接口呢?

我知道这是一个非常基础的问题,但是面试官用一种非常巧妙的方式问我,我无能为力:(\n我只知道接口的材料或理论定义,并且在我参与的许多项目中实现了它。但是我真的不明白为什么和如何使用它。\n我也不明白接口中的一个问题。比如,我们在finally块中使用conn.Dispose();。但是我没有看到该类实现或继承了IDisposable接口(SqlConnection)类。我想知道我如何调用这个方法名。同样的问题,我也不明白Dispose方法是如何工作的,因为我们需要为所有接口方法实现自己的方法体。所以接口是如何被接受或称为契约的?这些问题一直在我脑海中盘旋,坦率地说,我从来没有看到过任何能够以我能理解的方式解释这些问题的好文章。\n像往常一样,MSDN看起来非常吓人,没有一行文字是清晰的(对于从事高级开发的人,请原谅,我强烈觉得任何代码或文章都应该让看到它的任何人理解,因此像其他许多人说的那样,MSDN没有用)。\n面试官说:\n他有5个方法,他很乐意直接在类中实现它们,但是如果你必须选择抽象类或接口,你会选择哪个,为什么?我回答了他我在各种博客中读到的关于抽象类和接口的优缺点的所有东西,但他并不满意,他想要了解“为什么使用接口”和“为什么使用抽象类”之类的通用问题,即使我只需要实现相同的方法一次而不会改变它。\n我在网络上找不到任何能够清晰地解释接口及其功能的文章。我是那些仍然不了解接口的众多程序员之一(我知道理论和我使用的方法),但对于自己是否理解它还不满意。

0
0 Comments

接口和类之间的区别是什么,为什么我可以直接在类中实现方法,还要使用接口?这个问题的出现的原因是因为作者想要理解接口和类在实际应用中的作用,并且希望得到解决方法。下面是整理后的

接口是实现者必须遵循的规范,而抽象类不仅可以有规范,还可以有共享的实现。一个类可以实现和继承多个接口,但只能继承一个抽象类。

为什么要使用接口:

- 没有默认或共享的代码实现

- 需要共享数据合同(如Web服务、SOA)

- 每个接口实现者有不同的实现方式(例如IDbCommand有SqlCommand和OracleCommand两个特定实现)

- 需要支持多重继承

为什么要使用抽象类:

- 有默认或共享的代码实现

- 希望减少代码重复

- 需要轻松支持版本控制

一个具体的实例是在面向服务架构(SOA)中使用接口。我们将WCF接口(数据合同)共享在一个.NET程序集中,以便.NET客户端可以轻松地通过ChannelFactory进行互操作(避免通过添加服务引用生成代码等方式),或者使用共享类型进行添加服务引用。

如果我只在抽象类中声明抽象方法,那么抽象类就可以充当接口,那为什么还需要接口呢?

0
0 Comments

一个原因是使用接口可以增加代码的灵活性。假设我们有一个方法,它以一个Account类类型的对象作为参数,例如:

public void DoSomething(Account account) {
  // 在这里做一些很棒的事情。
}

问题在于,方法的参数是固定的,只能接受一个Account的实现。如果你从不需要任何其他类型的账户,这是可以接受的。但是,如果我们使用一个账户接口作为参数,如下所示:

public void DoSomething(IAccount account) {
  // 在这里做一些很棒的事情。
}

这个解决方案不限定于特定的实现,这意味着我可以传递一个SuperSavingsAccount或ExclusiveAccount(两者都实现了IAccount接口),并为每个实现的账户获得不同的行为。

使用接口还有另一个重要的原因是实现多态性。在面向对象的编程中,多态性是一个非常有用的概念,它允许我们使用一个通用的接口来处理具有不同实现的对象。这样,我们可以根据需要动态选择使用哪个实现。

此外,接口还可以帮助我们遵循开放封闭原则。通过定义接口,我们可以将代码分离成不同的模块,每个模块都可以独立地进行修改和扩展,而不会影响到其他模块。这样,我们可以更容易地对代码进行维护和更新。

总之,使用接口可以增加代码的灵活性、实现多态性以及帮助我们遵循开放封闭原则。这些都是使用接口而不是直接在类中实现方法的原因。

0
0 Comments

接口和类之间的区别是什么?为什么我应该在类中直接实现方法时使用接口?

接口在需要创建类似的东西时非常有用。在上面的示例中,通过使用接口IMyLogInterface,开发人员可以实现自己的类,并在需要记录日志时实现WriteLog()方法。这样,其他开发人员就可以通过实现接口来使用MyLogClass中的WriteLog()方法。接口相当于告诉其他开发人员他们需要实现什么才能使用WriteLog()方法。

一个问题是,为什么在实例化MyClass和MyOtherClass后不直接调用aClass.WriteLog()方法,而要添加额外的步骤呢?原因是MyLogClass中的WriteLog()方法可以接受实现了IMyLogInterface接口的任何对象作为参数。这样,WriteLog()方法可以处理不同的日志实现方式。通过将对象传递给处理程序类,可以更加灵活地处理日志记录。

另一个问题是,为什么将日志示例放在Nugget上会更简单?接口只在本地范围内有效,其他开发人员可以从Nugget中使用日志记录器,而无需了解其详细实现细节。这样可以方便其他开发人员使用日志记录器,而不需要了解其内部实现。

最后,某些情况下这是否是策略模式的一个例子。答案是是的,这个例子可以被视为策略模式的一个应用,通过使用接口和不同的实现类来实现不同的日志记录策略。

总之,通过使用接口,可以实现类似的功能,同时提供更大的灵活性和可扩展性。接口允许开发人员定义一组方法或属性,然后在多个类中实现这些方法或属性。这样,不同的类可以根据自己的需求实现接口中的方法,从而实现不同的行为。

0