我可以将接口方法视为抽象方法吗?


15

我正在考虑这一点,我对此有些怀疑。

当我声明一个接口时,例如:

public interface MyInterface
{
   public void method1();
   public void method2();
}

这些接口方法可以被认为是抽象的吗?我的意思是抽象方法的概念是:

抽象方法是已声明但不包含任何实现的方法。

那么,可以将这些方法视为抽象方法吗?它们不是“纯”抽象方法,因为我没有使用这个abstract词,但从概念上讲,它们看起来像是。

您能告诉我些什么?

谢谢。


大概是最好的方式
billy.bob 2011年

5
@ billy.bob-我认为对于堆栈溢出来说太抽象了。这里没有特定的编码问题。
克里斯·

这是Java代码吗?
Andres F.

不,这不对。这只是一个例子。问题不在于任何编程语言。
rogcg

Answers:


14

接口就像一个“纯”抽象类。该类及其所有方法都是抽象的。抽象类可以具有已实现的方法,但是该类本身无法实例化(对于继承和后续DRY有用)。

对于接口,由于根本没有任何实现,因此对于它们的用途而言是有用的:合同。如果实现接口,则必须在接口中  实现方法。

因此,区别在于抽象类可以具有已实现的方法,而接口则不能。

它们分开的原因是,一个类可以实现多个接口。Java和C#将类限制为单个父类的固有类。某些语言允许您从多个类继承,并且可以通过“纯”抽象类完成接口的工作。但是多重继承有其问题,即可怕的钻石问题


+1用于合并抽象类的继承与一个或多个接口的实现之间的差异。

钻石问题是一个令人敬畏的悖论。
rogcg 2011年

1
我不同意“接口就像一个“纯粹的”抽象类”部分。它们是2种不同类型的OO“构建块”,因此它们实际上根本不相似。它们具有一些共同的特征,但是在性质上却是不同的类型,例如更像男人和女人:)
NoChance 2011年

5
@Emmand Kareem我并不不同意“接口就像一个“纯粹的”抽象类”部分。这就是为什么我写它的原因:-)。如果您有任何不同意的理由,请发帖,ID喜欢听
编码员

值得注意的是,c#8还引入了默认接口实现
John Wu

11

我在这里找到了有用的答案:http : //download.oracle.com/javase/tutorial/java/IandI/abstract.html

接口中的所有方法都是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可能是,只是没有必要)。


1
还要注意,抽象类扩展另一个对象。接口没有超类的概念。

2
还要注意,您可以实现多个接口,但只能从一个类继承(无论是否抽象)。
NullUserException 2011年

@ThorbjørnRavnAndersen:一个接口可以扩展一个或多个接口。它与超类不是一回事,但它是一个继承级别。
unholysampler 2011年

您可以实现多个接口。看起来像多重继承的概念,但不完全相同。
rogcg 2011年

@unholysampler,它不是超类-正如我所说。


-1

此处的区别在于,抽象类可以包含实现细节,尽管它们本身无法实例化。而接口仅仅是类的模板


8
抽象方法不能包含实现细节。抽象可以。
Matt H

我知道方法和类之间的区别-但我不明白您在说什么?
billy.bob 2011年

您的回答指出,抽象方法可以包含实现细节,而不能。只是错字?
Matt H

1
我纠正了错字。
Martijn Verburg

1
@ billy.bob这个问题是关于abstact方法的。
SoylentGray 2011年

-2

因此,在子类中,继承的抽象方法可以再次在没有实现的情况下变为抽象,而如果类实现接口,则必须实现该方法。


-3

接口类没有抽象方法。他们根本没有任何方法。他们只是列出了另一个类必须能够实现以符合接口的方法的列表。在您的示例中,在有人将这些方法添加到类之前,没有方法method1和方法method2。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.