2011-09-01 7 views
5

Nodo de Java/Android aquí (todavía) Esperaba que pudieras ayudar.Agregar un método de la conciencia a la clase existente (Excepción de elenco de clase)

Estaba tratando de agregar un pequeño método de conveniencia para obtener el tiempo que ha pasado en lugar del número de veces desde EPOCH.

así que traté de hacer esto:

public class EasyLocation extends android.location.Location { 

    ... 

    public long getElapsedTime() { 
     return getTime() - System.currentTimeMillis(); 
    } 
} 

Sin embargo, cuando traté de usarlo como en el código debajo de la cual se proyecta a mi clase de Ubicación. Obtuve una excepción de cast de clase. Lo he leído y entiendo completamente por qué no funciona. Ese no es el problema.

El problema es que no es un éxito de tren pero me gustaría tener lo que se devuelve para tener mi método para que el resto de mi código sea un poco más limpio. No puedo encontrar una forma de evitarlo. ¿Alguna idea sobre cómo hacer eso?

lastNetworkLocation = (EasyLocation) locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

Gracias,

Gerard.

Respuesta

4

No puede hacerlo así. (A Location no es un EasyLocation.)

Creo que lo que estás buscando es la decorator pattern.

lo más habitual es hacer algo como esto:

public class EasyLocation extends android.location.Location { 

    public EasyLocation(Location loc) { 
     // copy data from loc to this. 
     super(loc); 
    } 
    ... 

    public long getElapsedTime() { 
     return getTime() - System.currentTimeMillis(); 
    } 
} 

Y en vez de hacer

lastNetworkLocation = 
    (EasyLocation) locationManager.getLastKnownLocation(
               LocationManager.NETWORK_PROVIDER); 

haces

lastNetworkLocation = 
    new EasyLocation(locationManager.getLastKnownLocation(
               LocationManager.NETWORK_PROVIDER)); 

Tenga en cuenta, sin embargo que la mayoría de la gente probablemente diga "Favorecer la composición sobre la herencia", y vaya con th

public class EasyLocation { 

    Location loc; 

    public EasyLocation(Location loc) { 
     this.loc = loc; 
    } 

    public long getElapsedTime() { 
     return getTime() - System.currentTimeMillis(); 
    } 

    public Location getLocation() { 
     return loc; 
    } 
} 
+0

Entonces, ¿usaría eso? lastNetworkLocation = new EasyLocation (locationManager.getLastKnownLocation (LocationManager.NETWORK_PROVIDER)); ¿Te gusta? – guided1

+0

exactamente. (respuesta actualizada) – aioobe

+0

Impresionante. ¡Estaba casi allí! ¡Gracias por eso! :) – guided1

Cuestiones relacionadas