关于接口

时间:2010-01-29 11:33:40

标签: c# java interface

  

可能重复:
  Interfaces: Why cant I seem to grasp them?

C#中接口的用途是什么?
它们如何在c#,Java中实现可扩展的模块化设计?

就我对接口的经验而言,我们在gridview场景中使用了列值来自不同的对象。

(例如:

List<IPub> list = new List<IPub>();
gridview.DataSource = list;
gridview.DataBind();

IPub有4种方法,由4或5个不同的类实现。 ) 除了上述情况之外,它们与同类相比它们派上用场的情况是什么?

我听说Java创建者鄙视接口或说“如果我有机会再次设计java;我永远不会将接口转换成语言”。 这也适用于C#吗? 有什么影响让他这么说? 我觉得我从来没有完全理解界面。 请有人煞费苦心地解释一下 编辑:这是Goslings quote,请参阅Java部分

6 个答案:

答案 0 :(得分:3)

接口可以被视为“可以做”,而抽象/基类可以被视为“是-a”。

所以狗是动物,所以你使用了基类。 一只狗可以做一个便便,所以便便可以成为其他动物可能实现的界面上的方法..(废话示例)

前几天阅读我的OO书,它假定应该避免具体的实例,好的OO编码员总是编程到接口或基类。

考虑到这一点,可能值得一份好的OO /模式书的副本,例如head first design patterns

答案 1 :(得分:1)

您应该看到answers herehereherehere

界面提供了一种使用方法,而不必担心如何实现。

如果你有一个正在使用的方法ITextGetter的界面GetText(string textKey),你不知道文本来自哪里,你所知道的就是当你要求提供文本时一个特定的键,你得到文本。如果您使用此界面为您编写应用程序,则可以使用所有实现界面的不同类来获取文本,而无需更改您的应用程序。这样可以轻松地从基于文件的文本转换到基于数据库或基于Web服务的文本,而无需更改任何使用该接口的代码

答案 2 :(得分:1)

接口是一种契约:如果某个类实现了某个接口,那么该类保证具有某些方法。当你从某个基类继承时,你可以拥有相同的东西,但你不能总是这样做。在这种情况下,接口很方便实现一种多重继承。

答案 3 :(得分:1)

接口就在那里,因此您无需为某些内容指定大量功能代码。你只需知道它的作用。这有点像你需要雇用一辆家用汽车。

你需要知道
A)它驾驶的汽车和 B)它有一个家庭大小的靴子。

您无需了解汽车的工作原理,发动机的工作原理。你只需要知道它可以做A)和B)。这就是界面的目的。

在C#中,我们不允许多重继承(即具有多于1个基类),因此如果要定义多于1个接口的行为,则无法使用类来执行此操作。如果存在多重继承,则可以选择使用多个基类来执行此操作。

答案 4 :(得分:1)

好吧,回到java开发的时候,有一个名为“Multiple inheritance”的东西,其中类可以从两个(或更多)不同的类派生。

例如,你有一个“Vehicle”类和一个“Animal”类,你可以拥有一个派生自两者的“Horse”类。

问题是,如果你想从两个具有共同功能名称的类派生一个类,该怎么办?你不可能真的,这个函数会有两个底层实现。

因此,例如,Vehicle和Animal类可能具有“move()”函数。好吧,如果你不自己覆盖它,那么当你调用horse.move()时会发生什么?这是未定义的!任何人都可以被召唤!

因此,在Java中,您只能从一个类派生。但是如果你真的需要一个与多种类型兼容的类呢?就像你有,例如,一个数据库连接,需要派生一个基类来使用DB,但也需要能够像具有close()函数的资源一样进行管理。

好的,所以他们创建了'Interfaces'。实现界面时,您不必担心下面的竞争代码,因为您必须自己实现它们。


人们普遍认为多重继承是“被认为有害的”(如GOTO),接口是一种获得好处而没有缺点的方式。但是,现在还有其他方法可以做到这一点。比如“DuckTyping”,只要类实现了功能名称,就可以了。

此外,java现在可以执行嵌套类,因此如果您需要从两个类派生类,则可以创建一个派生自第二个类的内部类。

不同的方法有其优点和缺点,但接口不是唯一想解决今天多重继承的问题。

答案 5 :(得分:1)

接口为您提供了一种有效地具有某种多重继承的方法(您不能从多个抽象基类继承)。如果你问自己为什么要禁止多类继承的问题,那么只需阅读Bjarne Stroustroup的一本书(在C ++上)中的相关章节,在那里你会看到它过于复杂。

另一方面,当您使用单元测试时,几乎您创建的每个接口都将至少有2个实现 - 真正的实现和模拟的测试。