#java #android #android-activity #interface #greenrobot-eventbus
#java #Android #android-активность #интерфейс #greenrobot-eventbus
Вопрос:
У меня есть два действия, которые оба затем расширяются из базового действия.
т.е.
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 и события жизненного цикла.
Я также использую библиотеку eventbus, как я могу использовать функцию подписки как onLowGasEvent, так и onLowBatteryEvent в HybridCarActivity?
Что я могу здесь сделать?
Ответ №1:
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
, вы должны сохранить подписчиков в качестве интерфейса активности, но также делегировать его реализацию обработчикам. Итак, вHybridActivity
:
@Subscribe(threadMode = ThreadMode.MAIN)
function onLowGasEvent(){
mGasImpl.onLowGasEvent();
}
@Subscribe(threadMode = ThreadMode.MAIN)
function onLowBatteryEvent(){
mBatteryImpl.onLowBatteryEvent();
}
Если onLow...Event
требуется Context
, обновите методы интерфейса, чтобы передать его в качестве параметра.
Надеюсь, это поможет.
Комментарии:
1. Поскольку Activity является особенным, он поставляется с событиями жизненного цикла activity. Итак, как мы можем использовать это в этом случае?
2. @CodingTT, я не уверен, что полностью понимаю вашу проблему. Не могли бы вы привести какой-нибудь пример?
3. Я обновил вопрос, я думаю, что в нем есть больше информации по вопросу
4. @CodingTT, спасибо, теперь все намного понятнее. У меня очень мало опыта
EventBus
, но я думаю, что предлагаемый подход все еще возможен. Пожалуйста, ознакомьтесь с обновленным ответом
Ответ №2:
Java не имеет множественного наследования. Вам нужно будет сделать так, чтобы объект Car имел общие методы, которые вы хотите использовать.
Ответ №3:
Как предполагает @Kristy Whesh, Java не допускает множественного наследования…но есть интерфейсы!
Просто сделайте что-то вроде этого:
-Создайте два интерфейса: один для бензинового автомобиля, а другой для электромобиля.
-Ваш гибридный автомобиль реализует эти два интерфейса, поэтому у вас есть две функции, которые вам нужно проверить.
-Ваши старые классы car реализуют правильный интерфейс в соответствии с их типом.
Надеюсь, это поможет или даст вам подсказку.
Приветствия