纯抽象类和接口

任何人都可以告诉我完全抽象的类和接口之间究竟有什么区别?

Abstract类也可以将其所有方法都抽象化。 接口的所有方法都是抽象的。 在这种情况下,两者之间的主要区别是什么?

如果纯抽象类和接口之间有区别? 界面有什么用? 在使用接口的地方,我们可以使用纯抽象类?

要完成以前的答案:

界面是“合同”。 如果类实现了接口,则必须提出接口中列出的所有服务。

抽象类是骨架。 它定义了扩展类的某种方式,同时让它们有一些自由空间(抽象方法)是唯一的。

一个纯粹的抽象类与接口做同样的事情,但是有一个独特的扩展问题,对我来说,没有兴趣

每个接口都是隐式抽象的:接口体中的每个方法声明都是隐式抽象和公共的。

抽象类具有可以包含实现的方法。 抽象方法可以是公共,受保护或默认访问(包可见)。 与接口不同,抽象类可以包含非静态和最终的字段。

另见:
接口与抽象类和Java教程

在Java和C#中,可以使用多个接口派生,并且只能从一个类inheritance,

这不是一个非常理论的解释,但是,编程上它是正确的

Interface Abstract Class Extend Class No Yes Extend Abstract Class No Yes Implement Interface Yes(Extend Interface) Yes Variables Public Static Final Public/Protected/Private/static/final/transient/volatile Contain Non-Public Method No Public/Protected/*Private Contain Abstract Method Yes Yes Contain No-Body, Non-Abstract Method Yes No Contain Defined Method No Yes Contain Main Method No Yes 

*抽象类可以有私有方法,但不是抽象私有方法。

在接口上选择纯抽象的一个原因是强制子类实现由超类实现的特定方法。

例如(在Java中),

假设您希望所有扩展类实现toString(),equals()和hashCode()。

您可以为该合约创建一个名为ForceSomeMethods的接口,但这些方法由Object隐式实现。

使用toString()等将ForceSomeMethods作为纯抽象类作为抽象方法,所有子类都将被强制实现这些方法。

抽象类可以提供实现,即(公共,受保护,私有)方法 。 接口只能声明公共方法签名。 必须通过实现接口的类来实现这些方法(以方法体的forms)。

有三个不同之处:

  1. 接口只能声明公共方法(即没有受保护或包私有的可见方法),并且不能声明任何字段
  2. 子类最多只能扩展一个抽象类,但可以实现任意数量的接口
  3. 抽象类可以具有部分或全部方法的实现

既然问题是纯粹的抽象类,那么我会说答案将与inheritance和范围有关。 这是我多次想知道的事情,这就是我想出的。

显然,之前已经回答了与多重inheritance相关的function,所以我不会介绍其中任何一个。 范围虽然很大。

接口中,您无法定义成员的访问修饰符,因为它们是隐式公共的,…您正在为其最终实现定义公共接口。 由于您可以在纯抽象类中定义受保护的抽象成员,因此存在重要差异。

inheritance自这样的类定义会强制inheritance者实现抽象成员,但私有地将其作用于类的使用者(尽管它必须被定义为protected因此除非将类标记为sealed ,否则进一步的inheritance者将具有访问权限)。

实质上,您可以使用纯抽象类定义私有接口。 这是一个好主意是完全不同的问题,但我看到它用于实现设计模式和标准化类设计。

HTH

您可以使用Interface进行多重inheritance,但不能使用抽象类进行多重inheritance。

Interface中的所有方法默认都是公共的,在抽象类中,只有你设置为抽象的方法才需要声明为public。

我只想解决一点(主要是因为已经解决了其他问题):

“在使用接口的地方,我们可以使用纯抽象类?”

从理论上讲,你可以。 但是,在某种程度上,您将失去灵活性和松耦合。 对接口进行编码并传递它们更为可取,特别是在控制反转(IoC)场景中以及从集成的角度来看,因为它允许更大的可扩展性。

类可以实现多个接口,但只能从一个类(抽象或其他)扩展。 如果需要指定接口,则应使用接口,以便类可以实现多个接口。