У меня есть два действия, которые оба затем распространяются на базовое действие.
то есть
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?
Что я могу сделать здесь?
В Java нет множественного наследования. Вам нужно будет сделать так, чтобы объект Car имел общие методы, которые вы хотите использовать.
Java не поддерживает множественное наследование реализация, но поддерживает множественное наследование интерфейс. Таким образом, вы можете реализовать столько интерфейсов, сколько захотите. Чтобы избежать дублирования и совместного использования кода между несколькими классами, вы можете использовать делегаты.
Например:
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
, обновите методы интерфейса, чтобы передать его в качестве параметра.
Надеюсь, поможет.
@CodingTT, я не уверен, что полностью понимаю твою проблему. Не могли бы вы привести пример?
Я обновил вопрос, я думаю, что у него есть больше информации для вопроса
@CodingTT, спасибо, теперь стало намного понятнее. У меня очень мало опыта работы с EventBus
, но я думаю, что предложенный подход все еще возможен. Пожалуйста, просмотрите обновленный ответ
Как предполагает @Kristy Whesh, Java не допускает множественного наследования... но есть интерфейсы!
Просто сделайте что-то вроде этого:
-Создайте два интерфейса: один для бензинового автомобиля, а другой для электромобиля.
- В вашем гибридном автомобиле реализованы эти два интерфейса, поэтому у вас есть две функции, которые вам нужно проверить.
-Ваши старые классы автомобилей реализуют правильный интерфейс в соответствии с их типом.
Надеюсь, что это поможет или даст вам подсказку.
Ваше здоровье
Поскольку активность особенная, она сопровождается событиями жизненного цикла активности. Так как же нам это присуще в данном случае?