【发布时间】:2011-06-05 16:34:38
【问题描述】:
如果接口有空方法(隐式抽象方法),那么它有什么用?为什么我们说它减少了代码并提供了可重用性?给我一个使用接口的真实例子,它显示了抽象类和接口之间的区别。
【问题讨论】:
-
你想要什么语言的样本?
-
@Mitch,这与标记接口无关。他问的是空的(实际上是抽象的)方法(就像所有接口一样),而不是没有方法的接口。
如果接口有空方法(隐式抽象方法),那么它有什么用?为什么我们说它减少了代码并提供了可重用性?给我一个使用接口的真实例子,它显示了抽象类和接口之间的区别。
【问题讨论】:
我喜欢将这些类型的功能称为“隐含代码文档”。使用界面可以将大量信息传达给将要处理您的项目的其他开发人员,这些信息可以帮助避免很多麻烦。
例如,如果一个类实现了一个具有 2 个方法的接口,而我是该项目的新手,这可能会告诉我编写这些方法的开发人员不希望更改方法签名。
想想 Dog 类和 Cat 类都实现了 Sociable 接口,其中有方法 walk(int speed)、sit()、layDown()、bite(int degree)。
如果我们有一个 Dog 类和一个 Cat 类来实现这些方法并且对它们有依赖关系,那么更改一个方法的签名可能会产生一些负面影响。
接口是帮助描述类的一种方式。在这个例子中,善于交际的狗和善于交际的猫有很多共同点。
就可重用性而言,您的类变得可重用,因为其他人更难进入并更改方法签名中定义的合同。
最后,虽然一个类只能继承一个类,但它可以实现多个接口。因此,使用接口的好处是我可以有一个实现 Big 和 Sociable 的 Dog,以及一个实现 Small 和 Sociable 的 Cat。
【讨论】:
由于您使用的术语,我假设您在谈论 Java。
接口代替抽象类很有用,因为一个类只能从一个类继承,但可以实现多个接口。
接口是程序各部分之间的契约。它说程序的一部分对实现这个接口的类有一定的期望。只要这些类支持该接口契约,程序的其他部分就不会关心如何该契约是如何实现的,只关心它是实现的。
它允许多态性和代码的重用。例如,(对于 Java),您可以采用 List 接口。您可以编写与List 对象接口的代码,而您不关心List 的实现。然后,您的代码可以与LinkedList 或ArrayList 或它可能处理的任何其他类型的列表一起使用,并且它应该能够很好地管理。您现在可以通过这个 List 接口合约编写具有一定期望的代码,并且在 15 年后,有人可以使用最新技术创建自己的 List 实现,并且您的代码将能够使用它。
【讨论】:
抽象类让您描述字段和非抽象方法。它不限于简单地描述接口,它涉及一些逻辑。另一方面,接口做它所说的,与逻辑无关。从客户端代码方面,您不必担心实现和工作方式。它使您无需额外的代码就可以将一个接口实现与另一个接口实现交换。
在实现代码方面,接口可以让你执行多个“继承”。
【讨论】:
界面更像是一份合同。它本身不提供任何实现重用。这实际上使您的代码与实现脱钩。拥有一个包含所有方法抽象的抽象类提供了相同的好处(如果我们忽略多重继承的问题)。
如果有一个很好的例子,请看一下 Java 集合以及如何使用 Collection、Map 和 Lists 的接口实现松散耦合。
【讨论】: