Puis-je considérer les méthodes d'interface comme des méthodes abstraites?

15

J'y pensais et j'avais des doutes.

Lorsque je déclare une interface, par exemple:

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

Ces méthodes d'interface pourraient-elles être considérées comme abstraites? Ce que je veux dire, c'est que le concept d'une méthode abstraite est:

Une méthode abstraite est une méthode qui est déclarée, mais ne contient aucune implémentation.

Alors, ces méthodes pourraient-elles être considérées comme abstraites? Ce ne sont pas des méthodes abstraites "pures" car je n'utilise pas le abstractmot, mais conceptuellement, on dirait qu'elles le sont.

Que pouvez-vous m'en dire?

Merci.

rogcg
la source
Probablement mieux sur SO
billy.bob
5
@ billy.bob - Je pense que c'est trop abstrait pour Stack Overflow. Il n'y a pas de problème de codage spécifique ici.
ChrisF
Est-ce du code Java?
Andres F.18
non ce n'est pas. ce n'est qu'un exemple. la question n'est centrée sur aucun langage de programmation.
rogcg

Réponses:

14

Une interface est comme une classe "purement" abstraite. La classe et toutes ses méthodes sont abstraites. Une classe abstraite peut avoir implémenté des méthodes mais la classe elle-même ne peut pas être instanciée (utile pour l'héritage et pour suivre DRY).

Pour une interface, puisqu'il n'y a pas du tout d'implémentation, elles sont utiles à leur destination: un contrat. Si vous implémentez l'interface, vous devez  implémenter les méthodes dans l'interface.

La différence est donc qu'une classe abstraite peut avoir implémenté des méthodes alors qu'une interface ne le peut pas.

La raison pour laquelle ils sont séparés est qu'une classe peut implémenter plusieurs interfaces. Java et C # restreignent une classe à inhérente à une seule classe parent. Certains langages vous permettent d'hériter de plusieurs classes et vous pouvez accomplir le travail d'une interface via une classe abstraite "purement". Mais l'héritage multiple a ses problèmes, à savoir le redoutable problème du diamant

codeur
la source
+1 pour incorporer la différence entre l'héritage d'une classe abstraite et l'implémentation d'une ou plusieurs interfaces.
Diamond Problem est un formidable paradoxe.
rogcg
1
Je suis en désaccord avec "Une interface est comme une partie" purement "abstraite". Il s'agit de 2 types différents de «blocs de construction» OO, ils ne sont donc pas du tout similaires. Ils partagent certaines caractéristiques communes, mais dans la nature, ils sont de types différents, plus comme les hommes et les femmes par exemple :)
NoChance
5
@Emmand Kareem Je ne suis pas en désaccord avec "Une interface est comme une partie" purement "abstraite". C'est pourquoi je l'ai écrit :-). Si vous avez de bonnes raisons pour votre désaccord, veuillez poster, j'aimerais entendre
codeur
Il est à noter que c # 8 introduit également le concept d'une implémentation d'interface par défaut
John Wu
11

J'ai trouvé une réponse utile ici: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Toutes les méthodes d'une interface sont implicitement abstraites, donc le modificateur abstrait n'est pas utilisé avec les méthodes d'interface (il pourrait l'être - ce n'est tout simplement pas nécessaire).

rogcg
la source
1
Notez également qu'une classe abstraite étend un autre objet. Les interfaces n'ont aucune notion de superclasse.
2
Notez également que vous pouvez implémenter plusieurs interfaces, mais vous ne pouvez hériter que d'une seule classe, abstraite ou non.
NullUserException
@ ThorbjørnRavnAndersen: Une interface peut étendre une ou plusieurs interfaces. Ce n'est pas la même chose qu'une super classe, mais c'est un niveau d'héritage.
unholysampler
Vous pouvez implémenter plusieurs interfaces. Ressemble au concept d'héritage multiple, mais pas exactement.
rogcg
@unholysampler, qui n'est pas une superclasse - comme je l'ai dit.
4

Les classes abstraites peuvent avoir des méthodes abstraites.

Les interfaces ne peuvent avoir que des méthodes abstraites.

method1()et method2()dans votre exemple sont des méthodes abstraites.

Tulains Córdova
la source
-1

La différence ici est que les classes abstraites peuvent contenir des détails d'implémentation, bien qu'elles ne puissent pas être instanciées par elles-mêmes. Alors qu'une interface n'est qu'un modèle pour une classe

billy.bob
la source
8
Les méthodes abstraites ne peuvent pas contenir de détails d'implémentation. Les classes abstraites peuvent.
Matt H
Je connais la différence entre une méthode et une classe - mais je ne comprends pas le point que vous faites?
billy.bob
Votre réponse indique que les méthodes abstraites peuvent contenir des détails d'implémentation - elles ne le peuvent pas. Juste une faute de frappe?
Matt H
1
J'ai corrigé la faute de frappe.
Martijn Verburg,
1
@ billy.bob cette question concerne la méthode abstact.
SoylentGray
-2

Ainsi, dans une sous-classe, la méthode abstraite héritée peut redevenir abstraite sans implémentation, tandis que si une classe implémente une interface, sa méthode doit être implémentée.

Devraj Giri
la source
-3

Les classes d'interface n'ont pas de méthodes abstraites. Ils n'ont aucune méthode. Ils ont juste une liste de méthodes qu'une autre classe devrait implémenter pour pouvoir se conformer à l'interface. Dans votre exemple, il n'y a aucune méthode method1 et aucune méthode method2 tant que quelqu'un n'ajoute pas ces méthodes à une classe.

gnasher729
la source