Linguaggi di programmazione orientati agli oggetti, ad es. java, C#, ... supporto per l'oggetto typecasting. Per esempio, questo è perfettamente valido in Java:Il casting di oggetti è una buona pratica?
URL url = new URL("url");
URLConnection conn = url.openConnection();
if(!conn instanceof HttpURLConnection)
throw new Exception("not http request");
HttpURLConnection con = (HttpURLConnection) conn;
Oppure un altro esempio di base che ho provato:
public class Base
{
public void base(){}
}
public class Derived extends Base
{
public void derived(){}
}
Base b = new Derived();
b.base();
classe derivata ha tutta la classe metodi di base ha, più più. Non c'è motivo per cui non sia possibile creare una classe base chiamando il costruttore della classe derivata.
Mi sono anche imbattuto in questo link http://www.volantec.biz/castingObjects.htm che spiega come funziona il typecasting degli oggetti internamente. Fin qui, ok.
Ma perché il primo esempio non utilizza HttpURLConnection con = new HttpURLConnection("url address")
(so che HttpURLConnection è una classe astratta). Sembra solo più chiaro, più semplice. D'altra parte quando hai a che fare con interfaces, object typecasting comes in handy. Un altro esempio è la lista List<Object>
, che a volte vedo in alcune classi. Significa che puoi salvare ogni classe possibile in questa lista. In seguito puoi lanciarlo sul suo originale, se sai di che tipo si tratta. Non sarebbe più semplice salvare solo classi specifiche da elencare, ad esempio List<String>
, List<MyClass>
. Sta usando le buone pratiche di progettazione List<Object>
?
Il casting obbligatorio su 'HttpURLConnection' è un esempio perfetto di OOD errato. Per quanto riguarda gli elenchi generici: dipende, ma preferirei elenchi parametrizzati quanto più possibili, così potrei catturare molte eccezioni del cast di tipo runtime al momento della compilazione. –
Bene, la risposta è nella domanda: HttpUrlConnection è una classe astratta, quindi non è possibile creare un'istanza di HttpUrlConnection. Solo di una sottoclasse. E questo è ciò che url.openConnection() fa. –
@ JBNizet L'ho menzionato tra parentesi. Sono consapevole che HttpURLConnection è una classe astratta, quindi non puoi creare un'istanza come hai menzionato. Hai ragione, volevo solo dimostrarlo, forse qualche altro esempio è più appropriato. – broadband