2012-03-08 3 views
27

Lorsque j'implémente une méthode interface, je suis obligé d'en faire une méthode public.Pourquoi devrions-nous déclarer les méthodes d'interface comme publiques?

Nous pouvons avoir des cas où nous voulons utiliser le default (comme dans le cas d'un accès dans le même paquet) ou protected.

Quelqu'un peut-il expliquer la raison de cette limitation?

+0

Si vous souhaitez que les membres privés et protégés ou méthodes statiques et champs non statiques, vous pouvez utiliser une 'abstract class' –

+0

@roottraveller Ce n'est pas un doublon de cette question –

Répondre

50

Les interfaces sont destinées à définir l'API publique d'un type - et seulement cela, pas son implémentation. Ainsi, toute méthode (ou membre statique) que vous définissez dans une interface est par définition public.

Étant donné qu'une interface ne peut contenir aucune implémentation concrète, il n'existe aucun moyen d'appeler des méthodes membres depuis l'intérieur. Et déclarer de telles méthodes mais en leur laissant des appels à des sous-classes ou à des clients totalement indépendants signifierait que votre définition de type est incomplète et fragile. C'est pourquoi, si vous avez besoin de définir des membres d'accès protégés ou de package, vous pouvez le faire dans une classe abstraite (qui peut également contenir une implémentation).

+0

@ peter-well qui a du sens dans une certaine mesure! – Vishnu

+8

Je pense que cette réponse est juste, mais c'est fondamentalement une façon détournée de dire, "parce que c'est ce que voulaient les gens de Java." Vous pourriez aussi trouver des arguments parfaitement raisonnables pour avoir des méthodes protégées (package-private pourrait être un peu plus difficile à justifier). Mais vous ne pouvez certainement pas avoir de méthodes privées, puisque celles-ci ne sont jamais héritées. Je suppose que, plutôt que de dire «ce sous-ensemble de visibilités, et voici pourquoi-mais-pas-ça», ils ont pensé qu'il serait plus simple de simplement dire «voici la visibilité que vous obtenez». – yshavit

+0

@yshavit, j'ai essayé de penser à * pourquoi * les gens de Java voulaient que les choses soient comme ça. Un élément d'information qui a été omis ci-dessus est qu'ils ont ajouté des interfaces à la langue spécifiquement parce qu'ils voulaient interdire l'héritage multiple, et tous les problèmes qu'il a soulevés en C++. –

9

Peut-être this fournira quelques réponses.

À ma connaissance, vous utilisez interfaces pour permettre aux personnes extérieures à votre code d'interagir avec votre code. Pour ce faire, vous devez définir vos méthodes public.

Si vous souhaitez forcer quelqu'un à remplacer un ensemble donné de méthodes privées, vous pouvez déclarer une classe abstraite avec une série de méthodes protégées abstraites.

+4

"méthodes privées abstraites" ... vouliez-vous dire "méthodes protégées abstraites"? – BoltClock

+0

@ npinti-bien mis en termes simples! – Vishnu

+0

@BoltClock: Oui, vous avez raison. Correction de cela :) – npinti

1

Une interface est un contrat que la classe qui l'implémente aura les méthodes dans l'interface. L'interface est utilisée pour montrer au reste du programme que cette classe a les méthodes et qu'elles peuvent être appelées

+0

Oui, mais les interfaces sont également des types. Parfois, les programmeurs veulent utiliser les types qu'ils ont créés sans les exporter dans le cadre de l'API. C'est là que forcer les méthodes d'interface à être publiques est embêtant. – scottb

0

EDIT: Cette réponse est destinée aux implémentations d'interface C#. Dans ce cas de Java le scénario est similaire juste que l'analyseur syntaxique veut un mot-clé publique mentionné dans l'interface, qui est implicitement fait en C#

méthodes d'interface sont implicitement publiques en C# parce qu'une interface est un contrat destiné à être utilisé par d'autres classes. En outre, vous devez déclarer ces méthodes être publiques, et non statiques, lorsque vous implémenter l'interface.

interface IStorable 
{ 
    void Read(); 
    void Write(object obj); 
} 

Notez que les IStorable déclarations de méthode pour Read() et Write() ne comprennent pas les modificateurs d'accès (public, protected ..). En fait, fournir un modificateur d'accès génère une erreur de compilation.

class Document : IStorable 
{ 
    public void Read() 
    { 
     // 
    } 
    public void Write(object obj) 
    { 
     // 
    } 
} 

Il suffit de penser sur les interfaces comme contrats être mis en œuvre comme public

+0

En Java, vous devez spécifier le mot clé 'public'. – Groo

+0

@Groo Mon mauvais, peut-être que je n'ai pas vu le tag associé à la question. Je prenais à propos de l'affaire en C#, je vais le mentionner dans le montage. –

-1
  1. Si nous marquons une méthode d'interface privée la classe qui implémente l'habitude voir la méthode ne peut pas jouer la remplacer. Si nous marquons une méthode d'interface comme protégée, la classe d'implémentation ne verra pas la méthode sauf si elle se trouve dans le même package que l'interface .

  2. Si nous marquons une méthode d'interface sans modificateur d'accès de la
    classe implémentant ne verrez pas la méthode à moins qu'il soit dans le même
    package que l'interface

Questions connexes