2016-11-05 1 views
-1

J'ai essayé de travailler cela depuis quelques jours maintenant et j'ai besoin d'un peu de poussée dans la bonne direction.Dans la mise en œuvre de mon interface A je veux retourner une instance de type interface B

La question:

Je suis en train de construire un système simple de log-in dans mon application web. J'essaie de faire en sorte qu'il n'y ait pas de couplage entre mes cours. J'ai construit deux interfaces;

public interface Authenticable { 
    String getUsername(); 
    boolean changePassword(char[] password); 
} 

Cette interface sera implémentée par des classes qui peuvent être authentifiées.


public interface Authenticator { 
    Authenticable authenticate(String username, char[] password) throws AuthenticationException; 
} 

Et cette interface sera mise en œuvre par les classes qui peuvent authentifier un Authenticable.


Actuellement je n'ai pas une base de données ou quoi que ce soit, mais j'ai décidé que je veux être en mesure de construire simple Authenticator premier et plus tard pouvoir l'échanger pour un autre (qui pourrait utiliser une base de données ou système de fichiers).

La première mise en œuvre que j'ai fait était:

public class HardcodedAuthenticator implements Authenticator { 
    @Override 
    public Authenticable authenticate(String username, char[] password) throws AuthenticationException { 
     if (username == "test" && password == new char[]{'t', 'e', 's', 't'}) { 

     } 
    } 
} 

Cette implémentation vérifie simplement si le nom d'utilisateur est égal à « test » et le mot de passe est égal à « test ».

Si c'est le cas: renvoie une instance de Authenticable.
Si ce n'est pas le cas: Lancez une AuthenticationException.


Cependant, dans mon HardcodedAuthenticator je ne veux pas être limité à une mise en œuvre du Authenticable (Atleast c'est ce que je pense serait le mieux) mais je veux toujours être en mesure de retourner une instance de Authenticable ..

La question:

Comment la mise en œuvre de l'interface Y un retour d'une instance de l'interface B?

Merci beaucoup d'avance.
Christian Adkin

+0

Ur requête est source de confusion .. Besoin d'un peu plus de clarifications –

+0

Donc vous voulez que les différentes implémentations de 'Authenticable' soient possibles? Vous pouvez avoir un 'setAuthenticable (Authenticable a)' qui est ensuite utilisé par la classe, ou autoriser les sous-classes de 'HardcodedAuthenticator' à remplacer l'implémentation par défaut. La stratégie ou la méthode d'usine/usine abstraite pour réaliser ce genre de comportement. –

+0

Confused statement "Cependant, dans mon HardcodedAuthenticator, je ne veux pas me limiter à une implémentation de l'Authenticable (Atleast c'est ce que je pense être le mieux) mais je veux toujours pouvoir retourner une instance de Authenticable ..". –

Répondre

-1

si je comprends votre problème correctement Vous ne voulez pas votre implémentation de Authenticator d'avoir une dépendance à l'une mise en œuvre spécifique de Authenticable vous devez injecter référence de type Authenticable à votre Authenticator

 public interface Authenticator { 
        Authenticable authenticate(String username, char[] password,Authenticable authenticable) throws AuthenticationException; 
     } 

essayer Pour faire des recherches sur l'injection de dépendance, vous trouverez de nombreux articles utiles si vous êtes encore confus à ce sujet.

+0

C'est exactement ce que je voulais dire par ma question. Cela ressemble à une excellente façon de résoudre mon problème et je vais faire des recherches sur l'injection de dépendance. –