Как унаследовать от нескольких действий с событиями жизненного цикла и поддержкой шины событий в Android Java?

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

то есть

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?

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
131
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ответ принят как подходящий

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

Например:

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

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

class BatteryImpl implements IBattery {
  checkBattery() {
  ...
  }
  onLowBatteryEvent() {
  ...
  }
}
  1. Мероприятия (обратите внимание на установку реализации):
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();
  }
}
  1. И тогда ваш HybridCar будет примерно таким:
class HybridCar extends Car implements IGas {
  IGas mGasImpl;
  IBattery mBatteryImpl;   

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

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

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

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

Поскольку активность особенная, она сопровождается событиями жизненного цикла активности. Так как же нам это присуще в данном случае?

CodingTT 09.04.2019 20:43

@CodingTT, я не уверен, что полностью понимаю твою проблему. Не могли бы вы привести пример?

S-Sh 09.04.2019 20:50

Я обновил вопрос, я думаю, что у него есть больше информации для вопроса

CodingTT 09.04.2019 21:03

@CodingTT, спасибо, теперь стало намного понятнее. У меня очень мало опыта работы с EventBus, но я думаю, что предложенный подход все еще возможен. Пожалуйста, просмотрите обновленный ответ

S-Sh 09.04.2019 21:18

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

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

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

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

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

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

Ваше здоровье

Другие вопросы по теме