2015-08-21 16 views
8

Il sovraccarico va bene. Ma se consideriamo che abbiamo due oggetti ObjectA e objectB. Entrambi hanno variabile "id" e "name". Vorrei scrivere un metodo (in terza classe), che restituisce il nome dell'oggetto dato. Scrivere funzioni sovraccariche mi fa ripetere il codice. È una buona pratica? Non sarebbe meglio usare invece le funzioni generiche?Utilizzo di metodi generici come alternativa al sovraccarico?

Quindi, so che posso scrivere una funzione sovraccaricata, sth. così:

public String getInfo(ObjectA o){ 
    if(o.getId()!=1) return o.name; 
    return ""; 
} 
public String getInfo(ObjectB o){ 
    if(o.getId()!=1) return o.name; 
    return ""; 
} 

E funziona bene. Ma entrambe le funzioni sono identiche! L'unica differenza è il fatto, hanno bisogno di una discussione del diverso tipo. Perché sembrano uguali, non sta violando la regola DRY? Ho provato a scrivere un metodo generico semplice, ma IDE sta contrassegnando that.getId e that.name() come errore e consiglio di lanciarlo come ((ObjectA) che) .getId() o ((ObjectB) che) .getId (). Non ho fatto che nella linea" T = che clazz.cast (o) ;? Quello che sto facendo male?

public <T> String getInfo(Class<T> clazz, Object o) { 
       T that = clazz.cast(o); 
       if (that.getId()!=1) return that.name; 

      return ""; 
     } 

In generale vorrei sapere, se la mia idea è possibile. Come può o è meglio semplicemente scrivere funzioni sovraccariche?

+11

Una tipica soluzione potrebbe essere quella di garantire che sia Objecta e ObjectB implementare un'interfaccia che dichiara i metodi hasName e hasid. –

+0

Dato che 'T' viene cancellato in' Object', il precedente non verrà compilato, poiché 'Object.getId()' non è un metodo effettivo. Come altri hanno suggerito, avresti bisogno di avere un'interfaccia comune su cui è definito 'getId'. –

+0

@AndyTurner Il tipo di cancellazione non immette l'immagine qui, è pura algebra di tipo. Il _upper bound_ di 'T' è' Object'. Le conseguenze della cancellazione si verificano solo in fase di esecuzione (e in alcuni casi degenerati in fase di compilazione, ma solo a causa della svolta specifica sulla cancellazione in Java). –

risposta

22

Entrambe le idee non sono buone. Il tuo ObjectA e 0 Le classidevono implementare un'interfaccia comune che definisce i metodi getId() e getName().

allora si può ottenere via con un solo metodo:

public String getInfo(Interface o){ 
    if(o.getId()!=1) return o.getName(); 
    return ""; 
} 
+3

O semplicemente 'getInfo()' è un metodo sull'interfaccia con un'implementazione predefinita? – Kevin

+0

@Kevin Non ho specificato dove mettere il singolo metodo;) ma molto probabilmente non userei un metodo predefinito per un caso come questo (anche se non è chiaro quale sia il "caso" qui). Questo codice sembra abbastanza banale ed è facilmente risolvibile con un'interfaccia "vuota". – Kayaman

18

Il tuo caso è un buon candidato per la programmazione all'interfaccia. Crea un'interfaccia e muovi i metodi più comuni

public String getInfo(InterfaceAB in){ 
    if(in.getId()!=1) return in.getName(); 
    return ""; 
}