Добавление удобного метода в существующий класс (исключение приведения класса) - PullRequest
5 голосов
/ 01 сентября 2011

Java / Android noob здесь (Все еще) Я надеялся, что вы можете помочь.

Я пытался добавить небольшой удобный метод, чтобы получить количество прошедшего времени, а не количество времени, прошедшее с EPOCH.

Итак, я попытался сделать это:

public class EasyLocation extends android.location.Location {

    ...

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

Однако, когда я попытался использовать его, как в коде ниже, который приводит его к моему классу Location.Я получил исключение в классе.Я прочитал об этом, и я полностью понимаю, почему это не работает.Проблема не в этом.

Проблема в том, что это не крушение поезда, но я хотел бы получить то, что возвращается, с моим методом, чтобы сделать остальную часть моего кода немного чище.Я не могу найти способ обойти это.Есть идеи, как это сделать?

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

Спасибо,

Джерард.

1 Ответ

4 голосов
/ 01 сентября 2011

Вы не можете так делать. (A Location не EasyLocation.)

Я считаю, что вы ищете шаблон декоратора .

Обычно вы делаете что-то вроде этого:

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();
    }
}

И вместо того, чтобы делать

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

вы делаете

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

Имейте в виду, хотя , что большинство людей, вероятно, скажут: "Подарите предпочтение композиции по наследованию" и перейдите к

public class EasyLocation {

    Location loc;

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

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

    public Location getLocation() {
        return loc;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...