Как присущи множеству Activity с событиями LifeCycle и поддержкой шины событий в Android Java? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть два действия, которые оба затем расширяются от базового действия.

т.е.

CarActivity{

}

GasCarActivity extends CarActivity{

  function onCreate(){
     registerGasEvent() // so that onLowGasEvent() will work
  }

  function checkGas(){}

  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowGasEvent(){

  }
}

ElectricCarActivity extends CarActivity{

  function checkBattery(){}

  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowBatteryEvent(){

  }
}

Теперь мне нужна HybridCarActivity, которое использует функции GasCarActivity и ElectricCarActivity, а также события жизненного цикла.

Я также использую библиотеку событий, как мне использовать функцию подписки для onLowGasEvent и onLowBatteryEvent в HybridCarActivity?

Что я могу сделать здесь?

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Java не поддерживает множественное наследование реализации , но поддерживает множественное наследование интерфейса .Таким образом, вы можете реализовать столько интерфейсов, сколько захотите.Чтобы избежать дублирования и совместного использования кода несколькими классами, вы можете использовать делегаты.

Например:

  1. Интерфейсы:
interface IGas {
  checkGas();
  onLowGasEvent();
}

interface IBattery
  checkBattery();
  onLowBatteryEvent();
}
реализации общей функциональности
class GasImpl implements IGas {
  checkGas() {
  ...
  }
  onLowGasEvent() {
  ...
  }
}

class BatteryImpl implements IBattery {
  checkBattery() {
  ...
  }
  onLowBatteryEvent() {
  ...
  }
}
Деятельность (обратите внимание на раздел внедрения):
class GasCar extends Car implements IGas {
  IGas mGasImpl = new GasImpl();   // create it in your own code, or inject to inverse dependencies, etc.

  checkGas() {
    mGasImpl.checkGas();
  }

  onLowGasEvent() {
    mGasImpl.onLowGasEvent();
  }
}

class BatteryCar extends Car implements IBattery {
  IBattery mBatteryImpl;   

  checkBattery() {
    mBatteryImpl.checkGas();
  }

  onLowBatteryEvent() {
    mBatteryImpl.onLowBatteryEvent();
  }
}
И тогда ваш HybridCar будет выглядеть примерно так:
class HybridCar extends Car implements IGas {
  IGas mGasImpl;
  IBattery mBatteryImpl;   

  checkGas() {
    mGasImpl.checkGas();
  }
  checkBattery() {
    mBatteryImpl.checkBattery();
  }
}
Если вы хотите работать с EventBus, вы должны оставить подписчиков в качестве интерфейса Activity - но делегировать его реализацию также и обработчикам.Итак, в HybridActivity:
  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowGasEvent(){
     mGasImpl.onLowGasEvent();
  }

  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowBatteryEvent(){
    mBatteryImpl.onLowBatteryEvent();
  }

Если для onLow...Event требуется Context, обновите методы интерфейса, чтобы передать его в качестве параметра.

Надеюсь, это поможет.

1 голос
/ 08 апреля 2019

Java не имеет множественного наследования.Вам нужно сделать так, чтобы объект Car имел общие методы, которые вы хотите использовать.

0 голосов
/ 08 апреля 2019

Как подсказывает @Kristy Whesh, Java не допускает множественное наследование ... но есть интерфейсы!

Просто сделайте что-то вроде этого:

-Создайте два интерфейса: один для газаавтомобиль и другой для электромобиля.

-В вашей гибридной машине реализованы эти два интерфейса, поэтому у вас есть две функции, которые необходимо переопределить.

-В ваших классах старых автомобилей реализован правильный интерфейсв зависимости от их типа.

Надеюсь, что эта помощь или дать вам подсказку.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...