¿Puedo considerar los métodos de interfaz como métodos abstractos?


15

Estaba pensando en eso y tenía algunas dudas.

Cuando declaro una interfaz, por ejemplo:

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

¿Podrían estos métodos de interfaz ser considerados abstractos? Lo que quiero decir es que el concepto de un método abstracto es:

Un método abstracto es un método que se declara, pero no contiene implementación.

Entonces, ¿podrían estos métodos considerarse abstractos? No son métodos abstractos "puros" ya que no estoy usando la abstractpalabra, pero conceptualmente, parece que sí.

¿Qué me puedes decir al respecto?

Gracias.


Probablemente el mejor en SO
billy.bob

55
@ billy.bob: creo que es demasiado abstracto para Stack Overflow. No hay un problema de codificación específico aquí.
ChrisF

¿Es este código Java?
Andres F.

no, no es. Es solo un ejemplo. La pregunta no se centra en ningún lenguaje de programación.
rogcg

Respuestas:


14

Una interfaz es como una clase abstracta "puramente". La clase y todos sus métodos son abstractos. Una clase abstracta puede tener métodos implementados, pero la clase en sí no puede ser instanciada (útil para la herencia y después de DRY).

Para una interfaz, dado que no hay ninguna implementación, son útiles para su propósito: un contrato. Si implementa la interfaz, debe  implementar los métodos en la interfaz.

Entonces, la diferencia es que una clase abstracta puede tener métodos implementados mientras que una interfaz no.

La razón por la que están separados es para que una clase pueda implementar varias interfaces. Java y C # restringen una clase inherente a una clase principal única. Algunos lenguajes le permiten heredar de múltiples clases y puede realizar el trabajo de una interfaz a través de una clase abstracta "puramente". Pero la herencia múltiple tiene sus problemas, es decir, el temido problema del diamante


+1 para incorporar la diferencia entre la herencia de una clase abstracta y la implementación de una o más interfaces.

El problema del diamante es una paradoja asombrosa.
rogcg

1
No estoy de acuerdo con "Una interfaz es como una parte de" clase puramente abstracta ". Son 2 tipos diferentes de "bloques de construcción" OO, por lo que realmente no son similares en absoluto. Comparten algunas características comunes, pero en la naturaleza son diferentes tipos, más como hombres y mujeres, por ejemplo :)
NoChance

55
@Emmand Kareem No estoy de acuerdo con 'Una interfaz es como una parte de la clase abstracta "puramente". Por eso lo escribí :-). Si tiene alguna buena razón para su desacuerdo, publique, me gustaría escucharlo
codificador

Vale la pena señalar que c # 8 también introduce el concepto de una implementación de interfaz predeterminada
John Wu

11

Encontré una respuesta útil aquí: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Todos los métodos en una interfaz son implícitamente abstractos, por lo que el modificador abstracto no se usa con métodos de interfaz (podría serlo, simplemente no es necesario).


1
También tenga en cuenta que una clase abstracta se extiende uno de otro objeto. Las interfaces no tienen la noción de una superclase.

2
También tenga en cuenta que puede implementar múltiples interfaces, pero solo puede heredar de una clase, abstracta o no.
NullUserException

@ ThorbjørnRavnAndersen: una interfaz puede ampliar una o más interfaces. No es lo mismo que una súper clase, pero es un nivel de herencia.
unholysampler

Puede implementar múltiples interfaces. Parece el concepto de herencia múltiple, pero no exactamente.
rogcg

@unholysampler, que no es una superclase, como dije.

4

Las clases abstractas pueden tener métodos abstractos.

Las interfaces solo pueden tener métodos abstractos.

method1()y method2()en tu ejemplo son métodos abstractos.


-1

La diferencia aquí es que las clases abstractas pueden contener detalles de implementación, aunque no pueden ser instanciadas por sí mismas. Mientras que una interfaz es simplemente una plantilla para una clase


8
Los métodos abstractos no pueden contener detalles de implementación. Las clases abstractas pueden.
Matt H

Sé la diferencia entre un método y una clase, pero no puedo entender el punto que está haciendo.
billy.bob

Su respuesta indica que los métodos abstractos pueden contener detalles de implementación, no pueden. Sólo un error tipográfico?
Matt H

1
Arreglé el error tipográfico.
Martijn Verburg

1
@ billy.bob, esta pregunta es sobre el método abstracto.
SoylentGray

-2

Entonces, en una subclase, el método abstracto heredado puede volverse abstracto sin implementación, mientras que si una clase implementa una interfaz, su método debe implementarse.


-3

Las clases de interfaz no tienen métodos abstractos. No tienen ningún método en absoluto. Solo tienen una lista de métodos que otra clase tendría que implementar para poder ajustarse a la interfaz. En su ejemplo, no hay método método1 ni método método2 hasta que alguien agregue estos métodos a una clase.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.