Por que uma interface não pode implementar outra interface?


104

O que eu quero dizer é:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

Eu pesquisei e encontrei o seguinte :

implementsdenota a definição de uma implementação para os métodos de uma interface. No entanto, as interfaces não têm implementação, portanto isso não é possível.

No entanto, interface é uma classe 100% abstrata, e uma classe abstrata pode implementar interfaces (classe 100% abstrata) sem implementar seus métodos. Qual é o problema quando se define como "interface"?

Em detalhes,

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B

Respostas:


110

implementssignifica implementação, quando interfacese destina a declarar apenas para fornecer, interfacenão para implementação.

Um 100% abstract classé funcionalmente equivalente a um, interfacemas também pode ter implementação se você desejar (neste caso não permanecerá 100% abstract), então, da perspectiva da JVM, são coisas diferentes.

Além disso, a variável de membro em uma classe 100% abstrata pode ter qualquer qualificador de acesso, onde em uma interface eles estão implicitamente public static final.


8
A partir do Java 8, as interfaces podem ter métodos padrão, tornando-os muito mais semelhantes às classes abstratas nesse aspecto.
forresthopkinsa

4
Obrigado pela última frase!
Tao Zhang

24

implementssignifica que um comportamento será definido para abstractmétodos (exceto para classes abstratas, obviamente), você define a implementação.

extends significa que um comportamento é herdado.

Com as interfaces pode-se dizer que uma interface deve ter o mesmo comportamento de outra, não havendo nem mesmo uma implementação real. É por isso que faz mais sentido uma interface para extendsoutra interface em vez de implementá-la.


Em uma nota lateral, lembre-se que mesmo que uma abstractclasse possa definir abstractmétodos (da maneira sensata que uma interface faz), ela ainda é uma classe e ainda precisa ser herdada (estendida) e não implementada.


4

Conceitualmente, existem as duas classes e interfaces de "domínios". Dentro desses domínios que você está sempre estendendo, apenas uma classe implementa uma interface, que é uma espécie de "cruzar a fronteira". Então, basicamente, "estende" para interfaces espelha o comportamento para classes. Pelo menos eu acho que essa é a lógica por trás. Parece que nem todo mundo concorda com esse tipo de lógica (acho que é um pouco artificial) e, na verdade, não há razão técnica para ter duas palavras-chave diferentes.


Se "Y estende X" e não é selado, então é possível ter outro tipo "Z" que estende "Y". Isso será verdade quer X seja uma interface ou uma classe. Se "W implementa X", entretanto, então não é possível ter "V implementa W". O fato de que "estende" pode ser "encadeado" e "implementa" não pode parecer um bom motivo para ter palavras-chave diferentes.
supercat de

2

No entanto, a interface é uma classe 100% abstrata e a classe abstrata pode implementar interface (classe 100% abstrata) sem implementar seus métodos. Qual é o problema quando se define como "interface"?

Isso é simplesmente uma questão de convenção. Os escritores da linguagem java decidiram que "extends" é a melhor maneira de descrever esse relacionamento, então é isso que todos nós usamos.

Em geral, mesmo que uma interface seja "uma classe 100% abstrata", não pensamos sobre ela dessa forma. Normalmente pensamos nas interfaces como uma promessa de implementar certos métodos-chave, em vez de uma classe da qual derivar. E assim, tendemos a usar uma linguagem diferente para interfaces e não para classes.

Como outros afirmam, há boas razões para escolher "estende" em vez de "implementos".


Sim senhor. É uma questão de convenção. Muitas pessoas tentam justificar logicamente as restrições da linguagem Java original da Sun, quando se trata apenas de um ponto de vista pessoal. Se o compilador tivesse adicionado interfaces de "implementos", acho que as mesmas pessoas teriam justificado isso também. :-)
Little Santi

1

Espero que isso ajude um pouco o que aprendi em oops (core java) durante a minha faculdade.

Implementos denota a definição de uma implementação para os métodos de uma interface. No entanto, as interfaces não têm implementação, portanto isso não é possível. Uma interface pode, entretanto, estender outra interface, o que significa que ela pode adicionar mais métodos e herdar seu tipo.

Aqui está um exemplo abaixo, esse é o meu entendimento e o que aprendi na opa.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

e manter uma coisa em mente uma interface só pode estender outra interface e se você quiser definir sua função em alguma classe, então apenas uma interface é implementada, por exemplo, abaixo

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Agora, se uma classe implementasse essa interface, seria assim:

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

e se uma classe abstrata tem alguma função abstrata, defina e declare e você deseja definir essas funções ou pode dizer implementar essas funções, então você supõe que estende essa classe porque a classe abstrata só pode ser estendida. aqui está o exemplo abaixo.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Aqui está um exemplo de subclasse de MyAbstractClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

0

A interface é como uma abstração que não fornece nenhuma funcionalidade. Conseqüentemente, ele não 'implementa', mas estende as outras abstrações ou interfaces.


-6

Interface é a classe que contém um método abstrato que não pode criar nenhum objeto. Como a Interface não pode criar o objeto e não é uma classe pura, não vale a pena implementá-la.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.