Domanda

class A extends ApiClass
{
   public void duplicateMethod()
   {
   }
}    


class B extends AnotherApiClass
{
   public void duplicateMethod()
   {
   }
}

Ho due classi che estendono diverse classi API. I due di classe ha qualche duplicato metodi (stesso metodo ripetuto in entrambi classe) e come rimuovere questa duplicazione?

Modifica

Sia ApiClass e AnotherApiClass non sono sotto il mio controllo

È stato utile?

Soluzione

suona come un caso per il "modello di strategia".

class A extends ApiClass {
   private ClassContainingDupMethod strategy;
}

class N extends AnotherApiClass {
   private ClassContainingDupMethod strategy;

   public methodCallingDupMethod(){
      strategy.dupMethod();
   }
}

class ClassContainingDupMethod{
   public dupMethod(){;}
}

O è il dupMethod inherted dalle classi API?

Altri suggerimenti

A seconda di ciò che il codice è che si potrebbe fare qualcosa di simile:

public class Util
{
    public static void duplicateMethod()
    {
        // code goes here
    }
}

e poi basta avere gli altri due duplicateMethods chiamano quello. Quindi il codice non sarebbe stato duplicato, ma il nome del metodo e la chiamata alla Util.duplicateMethod sarebbe.

Se il codice nella Util.duplicateMethod necessaria per accedere alle variabili istanza / classe di A e di classe B che non avrebbe funzionato così bene, ma potrebbe potenzialmente essere fatto (fatemi sapere se avete bisogno di questo).

EDIT (sulla base di un commento):

Con variabili di istanza si ottiene meno abbastanza ... ma può essere fatto. Qualcosa di simile:

interface X
{
    int getVar();
    void setVar(A a);
}

class A 
    extends    ApiClass
    implements X
{
}

class B
    extends    AnotherApiClass
    implements X
{
}

class Util
{
    public static void duplicateMethod(X x)
    {
       int val = x.getVal();
       x.setVal(val + 1);
    }
}

Quindi, per ogni variabile è necessario accedere si farebbe un metodo per get (e impostare se necessario). Non mi piace questo modo dal momento che rendono i metodi get / set pubblico che può significare che si stanno facendo le cose a disposizione che non si vuole essere a disposizione. Un'alternativa sarebbe quella di fare qualcosa con la riflessione, ma mi piacerebbe che anche meno: -)

Duplica metodi che si basano su variabili membro implica variabili membro duplicati, anche - e che inizia a puzzare come troppo-grandi classi. Quali sarebbero queste variabili membro specifici, con il metodo (s), sembrano, se si dovesse estrarli nella loro classe, e poi comporre quella classe nelle vostre altre classi? Preferisco composizione per l'eredità .

class BaseApiClass
{
   public void duplicateMethod()
   {
   }
}

class ApiClass  extends BaseApiClass
{
}
class AnotherApiClass  extends BaseApiClass
{
}

class A extends ApiClass
{
}    

class B extends AnotherApiClass
{
}

È necessario combinare le classi in un unico oggetto e poi tutte le classi Uso delle altre due classi, modificare il proprio codice per utilizzare la singola classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top