【问题标题】:Why Interfaces can not have constructor but abstract classes have constructor为什么接口不能有构造函数但抽象类有构造函数
【发布时间】:2017-06-04 03:18:18
【问题描述】:

我们都知道不能同时创建接口和抽象类的对象,但是为什么抽象类可以有构造函数,接口不能有构造函数呢?无法创建两者的对象。我想要非常直接的答案而不是非常复杂的答案。

【问题讨论】:

    标签: oop constructor interface abstract-class


    【解决方案1】:

    构造函数用于初始化新实例的状态。

    抽象类可以定义状态并且可以有构造函数来初始化它。

    接口不能定义任何状态,因此不需要构造函数。

    【讨论】:

    • 好吧,我认为这不是全部原因(参见例如my answer),因为接口可以将它们声明的属性初始化为某种初始状态,尽管可以说它们确实如此不存储(“拥有”)自己的状态。
    • 你的意思是接口的构造函数可以调用setter或接口定义的任何其他方法吗?从构造函数调用抽象/虚拟/可覆盖的方法通常被认为是严重的代码异味。我认为这就是为什么接口首先不能有构造函数的原因。
    • 当这些方法不依赖于对象状态(但例如提供一些特定于类的信息)时,从构造函数调用可覆盖方法有它的位置,尤其是在缺乏可覆盖静态成员的语言中,如 C# 那样。我同意接口构造函数与类构造函数的调用顺序并不明显,但可能是一个问题。
    • 这与多重继承并没有什么不同。
    • 接口的用途或用途与抽象类基本相同,尤其是当它们只有抽象/虚拟方法时。那么唯一的区别就是状态。
    【解决方案2】:

    接口只是一组必须由实现实现的成员签名。为什么不能定义构造函数? 因为构造函数是一个实现细节

    假设当您想雇用某人时,您的重点不是候选人是谁,而是候选人能做什么(这是一种简化)。您的候选人是否拥有所需的技术背景?你的候选人可以进行团队合作吗?从 OOP 的角度来看,您知道候选人必须满足什么才能与您合作。因此,我不关心候选人的母亲以及候选人的出生时间/方式:我关心今天我可以接受哪些属性和行为。因此,您将为此定义一个类似CanWorkOnMyCompany 的接口。

    另一方面,抽象类是一个常规类,其中一些成员是签名,派生类必须为它们提供实现。也就是说,你不能实例化一个抽象类,因为它没有完全实现。

    您可能会争辩说抽象类不能提供抽象成员,但这不是他们的目的。

    【讨论】:

      【解决方案3】:

      接口(例如,至少在 .NET 和 Java 中)旨在专门用作它们的名称 - 以保证所有实现类中的某个接口(即(公共)成员集)。

      接口不应该有状态,甚至不应该定义像初始状态这样的东西。如果没有初始状态,接口的构造函数将无法完成任何合理的操作。

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 1970-01-01
        • 2013-11-25
        • 2022-01-22
        • 2012-12-25
        • 2014-04-23
        • 2018-09-10
        相关资源
        最近更新 更多