У меня несколько представлений, простирающихся Android каркасных классов:Как добавить логику повторного использования к классам, уже расширяющим другую?
class A extends ImageView // ImageView extends android.View
class B extends TextView //TextView extends android.View
class C extends LinearLayout //LinearLayout extends android.ViewGroup which extends android.View
У меня есть операции, которые могут быть применены к android.view
void notifyError(){
getParentView().notifyError() //I have type checks on getParentView()
}
Описанные выше методом является чрезмерно упрощенной версией одного из таких методы. Важной частью является:
- Все виды должны иметь метод notifyError()
- код в notifyError это точно то же самое для всех просмотров
В идеале я должен иметь абстрактный класс которые могут распространяться все взгляды. Я мог бы дать базовую реализацию notifyError() в абстрактном классе и все хорошо. Но это решение выходит за рамки, поскольку представление не может распространяться на несколько классов.
Решение, которое у меня есть, состоит в том, чтобы все мои представления реализовали интерфейс, который заставляет все виды переопределять notifyError(). Я создал статический вспомогательный класс, который затем вызывается функцией notifyError(). Все мои представления имеют код для вызова класса-помощника в методах notifyError(). Эта избыточность мне не подходит.
Есть ли лучший способ достичь этого? В случае, если кто-то интересуется этим требованием, вот оно: Если какое-либо из моих представлений-потомков получит ошибку, я хочу рекурсивно уведомить всех родителей об этой ошибке (пока мы не достигнем самой верхней родительской иерархии взглядов). У всех родителей одинаковая логика обработки ошибок для каждого ребенка.
EDIT: На основе комментариев, позвольте мне поделиться упрощенной обработки ошибок логики для notifyError() метод:
void notifyError(Exception e){
Log.e(TAG, e.getMessage());
getParentView().notifyError(e);
}
Я не вижу проблемы с абстрактным классом. Вы можете расширить свой абстрактный класс 'android.View', и ваши представления расширят ваш абстрактный класс. В противном случае я не знаю, может ли ваша версия Android использовать Java 8, но имейте в виду, что интерфейсы могут иметь стандартные (конкретные) методы в Java 8. Наконец, когда наследование не работает, следующим вариантом обычно является состав – Dici
ImageView, TextView и т. Д. - это рамки, предоставляемые классами с большой логикой, которые я не могу написать самостоятельно. Расширение просмотра напрямую - это кошмар! – SlowAndSteady
О, ладно, я думал, что это было твое. – Dici