8
votes

Comment prolonger une interface

Je suis codant pour interface.

J'ai une interface a forte> et une classe b forte> qui le met en œuvre. P>

On me dit que Je pourrais remplacer B's forts> les fonctionnalités en l'extentant par C strong> mais on me demande de toucher ni B fort> ni C fort> et puis remplacer ultérieurement B fort> avec C fort> comme classe de mise en œuvre de A fort> dans les fichiers de configuration. P>

i graphique que j'ai besoin que j'ai besoin Une méthode qui n'est pas disponible dans A fort>, donc j'ai besoin d'ajouter une méthode à A forte> que je pourrais implémenter dans C forte>. Mais je ne suis pas autorisé à toucher A fort>. P>

pourrait-il m'aider avec comment-pourrait-il-être fait? P>

Merci. P>

Modifier strong>: Exemple de code: strong> P>

A.JAVA strong> p>

A a = new C();
a.Z(); //can't do this


14 commentaires

Êtes-vous peut-être moyen: toucher ni A ni b


plus: pourquoi ne pouvez-vous pas avoir une méthode qui n'est pas dans l'interface? Ce n'est pas Objective-C!


Oui, je sais que c'est possible à Objc, mais c'est plus courant là-bas.


Vous ne pouvez pas toucher A, B, B ou C et doit remplacer B avec la mise en œuvre de A? Ceci est impossible à moins que vous ne puissiez altérer c ou étendre C à d et remplacer B avec votre nouvelle implémentation de D. Vous ne pouvez pas ajouter une nouvelle méthode en dehors de l'interface A et s'attendre à ce qu'il soit utilisé par les consommateurs par défaut d'une interface d'une interface.


Ok, mais qu'est-ce que tu voulais en réalité?


«Je pense que j'ai besoin d'une méthode qui n'est pas disponible dans A, donc j'ai besoin d'ajouter une méthode à laquelle je pourrais implémenter dans C.» - Qu'avez-vous voulu dire ici? Vous avez d'abord dit que vous avez besoin d'une méthode de non-A. Ensuite, vous dites que vous devez ajouter cette méthode à un !!


Vous écrivez la classe C non? Alors quel est le problème?


Peut-être que vous avez besoin de b ou c comme des classes abstraites? Ensuite, vous n'avez pas besoin de mettre en œuvre toutes les méthodes d'une classe abstraite. Est-ce que c'est ce que tu veux?


@Silverback: Ouais, bonne question. Si c a toutes les méthodes d'un, il peut être utilisé


@Teryone: Je suis désolé pour la réponse différée. J'ai édité la question de la rendre plus claire. J'utilise Java.


@ 11684: Oui, je n'ai pas pu toucher non plus a ou B , alors je devais écrire une classe C et l'étendre à partir de B Pour remplacer certaines des méthodes implémentées dans B , mais je pensais que j'avais besoin d'une nouvelle méthode et parce que je dois coder à l'interface, j'ai besoin d'avoir cette méthode dans a < / Code> Ainsi que j'utilise la variable de référence de à appeler les méthodes et la variable de référence A ne reflétera aucune méthode nouvellement ajoutée juste à C .


Ah, suppose que tu es sur des terrains au-delà de moi! @sauter


@skip Lorsque vous modifiez la question, veuillez modifier le texte entier et laisser une question qui a du sens seul. Ajouter des modifications à la fin n'atteint pas beaucoup les lecteurs.


@ 11684: J'ai effectué une dernière modification avec un exemple de tentative d'expliquer le problème que je tente de résoudre, au cas où il est possible de le faire grâce.


6 Réponses :


0
votes

Donc, selon ce que vous venez d'écrire, vous ne pouvez pas toucher A, B, ni c ... donc, étendre c avec d?

Ensuite, vous pouvez ajouter les méthodes dont vous avez besoin / souhaitez.


1 commentaires

Je ne peux pas toucher que a ou b . J'ai créé C car je devais remplacer certaines des méthodes implémentées dans B . La chose est que je codir pour interface à l'aide d'une variable de référence de type A mais la classe d'implémentation de A pourrait être B ou C ou d mais je dois avoir cette nouvelle méthode que je souhaite utiliser déclarée dans A` pour A's variable de référence à utiliser pour appeler ça méthode.



0
votes

Votre question n'est pas claire du tout. Est-ce que c'est ce que vous voulez dire ou ce que vous voulez?

public interface InterfaceA
{

}

public class ClassB implements InterfaceA
{

}

public class ClassC extends ClassB
{

}

public class ClassD extends ClassC
{

}

public class Main
{
    protected InterfaceA A;

    public Main()
    {
        //A = new ClassB();
        A = new ClassD();
    }


    public static void main(String[]args)
    {
    }
}


1 commentaires

Je ne peux pas toucher que a ou b . J'ai créé C car je devais remplacer certaines des méthodes implémentées dans B . La chose est que je codir pour interface à l'aide d'une variable de référence de type A mais la classe d'implémentation de A pourrait être B ou C ou d mais je dois avoir cette nouvelle méthode que je souhaite utiliser déclarée dans A` pour A's variable de référence à utiliser pour appeler ça méthode.



0
votes

Si la méthode est favorable, vous n'avez pas besoin de l'ajouter à une interface pour la mettre en œuvre. S'il est utilisé ailleurs, alors b implémente une autre interface d.


2 commentaires

Toute la question ici est codant pour interface A . À l'avant du client, j'utilise une variable de référence d'une méthode d'appel.


Je pense que je suis. Vous avez une variable qui est de type A. Vous savez que c'est un B et que vous devez appeler une méthode qui n'est pas dans l'interface d'une. Vous devez soit référence directement au lieu de référencer la généralisation A une tentative d'essayer de lancer à B et de manipuler les erreurs de coulée



8
votes

Je pense que je comprends ce que vous voulez. Vous avez ce qui suit: xxx

Si c'est ce que vous voulez, alors j'ai peur que cela ne puisse être fait. Toute personne travaillant avec A connaît uniquement les méthodes définies dans A ; Ils ne sauront pas que vous avez défini somenewmethod () dans votre classe c . Vous devez être autorisé à changer A .

Notez que dans l'extremis, vous pouvez vérifier le type de classe d'instances de A : xxx

mais c'est vraiment laid et casse bon nombre des règles cardinales de la programmation OO.


0 commentaires

1
votes

Je ne sais pas si vous êtes autorisé à le faire, mais vous pouvez prolonger des interfaces ainsi que des cours, vous pouvez faire:

Interface publique A2 étend un { annulation publique mysupertveryterestingNewmethod (); }


2 commentaires

Cela pourrait être fait, mais la tâche est la demande de travail sur plusieurs instances de A qu'il ne peut pas être imaginé pour remplacer toutes les instances de A par A2 . Il n'y avait aucune autre option, donc je devais déclarer la méthode dans l'interface A elle-même. Merci pour la réponse:).


Eclipse a une option de refacteur si vous CTRL + Cliquez sur Option. Ce n'est pas si dur! @sauter



0
votes

Ceci pourrait résoudre votre problème: xxx pré>

selon votre exigence p>

1-vous avez créé une interface A. p>

2-créé une classe B qui implémente un. p>

3-3 a créé une classe C qui s'étend B et des implements a. p>

4- a = nouveau c () créera une variable de référence du type Une mais au moment de l'exécution, il tiendra l'objet de c. P>

car vous ne pouvez pas toucher B et C, les signatures sont identiques et que vous appelez x () et y () et y () à partir d'un objet de c comme s'étend b. p>

par conséquent, vous avez remplacé B avec C sans implémenter x et y dans C et apporter des modifications à b. p>

sortie: p>

Something X
Something Y


0 commentaires