【问题标题】:Should I use inherit or interface?我应该使用继承还是接口?
【发布时间】:2009-10-27 00:47:16
【问题描述】:

有什么区别:

type IFooable =
    interface IDisposable

    abstract Foo : (unit -> unit)

type IFooable =
    inherit IDisposable

    abstract Foo : (unit -> unit)

?

如果等效,在哪些情况下我应该使用其中一种? 谢谢!

【问题讨论】:

    标签: inheritance f# interface


    【解决方案1】:

    (我最初是这么认为的)您必须将“继承”与(最多一个)基本一起使用。您可以将“接口”用于您要实现的任何接口。

    所以在 IDisposable 的情况下,它必须是 'interface'。

    编辑,好的编译器允许它,但这可能是一个错误,我会看看

    编辑:事实证明这可能是另一种方式的错误,并且可能的接口会迫使您使用“继承”来继承其他接口,其想法是“继承的”成员在“隐式接口”意义上总是直接可见的,而类上的“接口”声明是“显式”接口,需要对该接口类型进行强制转换才能使用这些成员。通过某种方式,我们可能会消除语言语法中的这种灵活性,以便只有一种方式来编写它,而不是两种等效方式。

    【讨论】:

    • 有道理。我现在对此有了更好的理解。非常感谢!
    【解决方案2】:

    我倾向于将继承用于真正的 oop(即 X isa Y)和接口作为一种装饰器实现。

    可能不是事实上的“正确”方式,但我们非常喜欢它。

    我的意思是 X 将继承 Y,但随后我们将希望从 V、W 和 Z 中为其提供一些额外的功能。

    “Jetta 是 Car,但也是 IDiesel、IGerman、Ibroken”

    这正是我当前项目的做法,我可能会因“滥用 oop”或其他原因而被否决:)

    【讨论】:

    • 听起来很疯狂。如果您的汽车同时实现 IBroken 和 IWorkingOrder 会怎样?丰田和福特?
    • 好吧,这是一个糟糕的例子! :) 实际上,一个更好的例子是具有一堆专用 TabPages 的 TabControl。有些是 ITxRx,因为它们具有某些类型的行为。其他人是另一种。疯狂的设计,当然,但奇怪的是它真的很好用。
    【解决方案3】:

    如果你只打算使用抽象方法,你应该使用接口。因为你只能继承一个类,但你可以实现很多接口。

    【讨论】:

      猜你喜欢
      • 2018-04-02
      • 2018-06-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多