【问题标题】:Interface vs Abstract and Inheritance接口与抽象和继承
【发布时间】:2015-10-16 06:39:00
【问题描述】:

我已经看过接口、抽象类和继承的用法。我看到每个都有它们的用途,但我还是有点困惑。

我知道一般一个类只能扩展另一个类,虽然有些可能支持多重继承,但它可以实现多个接口(这可能是使用接口的主要原因)。但是,如果我是正确的,这个类也可以由另一个类扩展。我还看到抽象类可能比接口更快,并且可以具有非静态最终变量。

所以,我仍然不确定什么时候使用哪个更好。也许通过举一些例子可以更好地理解这一点。我不反对使用任何东西,但我认为有些东西我看不到。进一步的解释也可能有所帮助。提前致谢。

【问题讨论】:

    标签: inheritance interface abstract-class multiple-inheritance extends


    【解决方案1】:

    这取决于你自己的风格。

    事实上,从抽象类继承的类必须使用它的所有属性和方法——几乎不可能创建一个干净的架构 多层次的继承。

    接口的主要优点是灵活性 - 您可以实现其中的大部分,但不必更改 你的类的内部结构来实现它们。

    在大多数情况下,使用接口是最佳做法,但在某些情况下除外 软件模式,例如组合模式或策略模式。

    但最终由您决定 - 您必须选择 您希望在项目中使用的继承类型。

    接口帮助您获得灵活性,抽象类带来更多 与您的体系结构的凝聚力,因为它们将类分组 相似在一起。 --> 你可以重用抽象类的代码 它的子类

    【讨论】:

      【解决方案2】:

      如果您想使用与基类相同的代码并使用额外的功能对其进行扩展,则从基类继承非常有用。

      Vitual 和 abstract 都与此有关。您可以使用基本实现创建虚拟方法。后代类可以(可选地)更改或添加到此实现。抽象类是本身不完整的基类。声明了一个抽象方法,但还没有实现。后代类必须提供实现。如果基类实现了一个流,这很有用,但该流的一部分需要由另一个类实现。基类需要能够调用该部分,这就是声明抽象方法的地方。

      界面是另一回事。接口是关于类中存在哪些方法的约定,但它们可以由两个完全不相关的类实现。这很方便,因为您可以为小块功能制作小接口。例如,可以保存的东西可以实现 ISavable,它只是强制方法“保存”的存在。两个完全不同的类可以实现这一点,例如允许保存所有功能来保存可以保存的所有内容。

      多重继承是一种特定的语言特性,在许多语言中不可用,但在许多语言中,您可以通过使用接口和 delegate 设计模式获得类似的效果。

      【讨论】:

        【解决方案3】:

        一般来说,当你想指定一个类应该做什么工作时,使用接口,而不是如何它应该这样做。例如,排序函数可能仅适用于实现某种Comparable 接口的类对象数组,该接口要求它实现比较运算符,但它并不关心这种比较究竟是如何工作的。

        另一方面,抽象类将包含一些实际的代码Comparable 抽象类可能会使用比较运算符实现各种算法,但除非您在子类中实际实现此类运算符,否则它还不能被实例化。

        一个类不能扩展多个超类,因为所谓的菱形问题(和类似的事情)。但是,接口不携带任何代码,所以这不是问题,您可以在单个类中实现多个接口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-05
          • 2013-01-09
          • 2019-01-09
          • 2014-03-11
          • 2013-05-14
          • 2014-10-09
          • 2021-06-25
          相关资源
          最近更新 更多